- Timestamp:
- 2017-09-27T16:29:24+02:00 (7 years ago)
- Location:
- branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN
- Files:
-
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/divhor.F90
r7753 r8568 29 29 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 30 30 USE lib_mpp ! MPP library 31 USE wrk_nemo ! Memory Allocation32 31 USE timing ! Timing 33 32 … … 40 39 # include "vectopt_loop_substitute.h90" 41 40 !!---------------------------------------------------------------------- 42 !! NEMO/OPA 3.7 , NEMO Consortium (2014)41 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 43 42 !! $Id$ 44 43 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 64 63 !!---------------------------------------------------------------------- 65 64 ! 66 IF( nn_timing == 1) CALL timing_start('div_hor')65 IF( ln_timing ) CALL timing_start('div_hor') 67 66 ! 68 67 IF( kt == nit000 ) THEN … … 75 74 DO jj = 2, jpjm1 76 75 DO ji = fs_2, fs_jpim1 ! vector opt. 77 hdivn(ji,jj,jk) = ( e2u(ji ,jj) * e3u_n(ji ,jj,jk) * un(ji ,jj,jk) 78 & - e2u(ji-1,jj) * e3u_n(ji-1,jj,jk) * un(ji-1,jj,jk) 79 & + e1v(ji,jj ) * e3v_n(ji,jj ,jk) * vn(ji,jj ,jk) 80 & - e1v(ji,jj-1) * e3v_n(ji,jj-1,jk) * vn(ji,jj-1,jk) )&81 & / ( e1e2t(ji,jj) * e3t_n(ji,jj,jk))76 hdivn(ji,jj,jk) = ( e2u(ji ,jj) * e3u_n(ji ,jj,jk) * un(ji ,jj,jk) & 77 & - e2u(ji-1,jj) * e3u_n(ji-1,jj,jk) * un(ji-1,jj,jk) & 78 & + e1v(ji,jj ) * e3v_n(ji,jj ,jk) * vn(ji,jj ,jk) & 79 & - e1v(ji,jj-1) * e3v_n(ji,jj-1,jk) * vn(ji,jj-1,jk) ) & 80 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 82 81 END DO 83 82 END DO … … 90 89 END DO 91 90 ! 92 IF( ln_rnf ) CALL sbc_rnf_div( hdivn ) !== runoffs ==! (update hdivn field)91 IF( ln_rnf ) CALL sbc_rnf_div( hdivn ) !== runoffs ==! (update hdivn field) 93 92 ! 94 IF( ln_isf ) CALL sbc_isf_div( hdivn ) !== ice shelf ==! (update hdivn field)93 IF( ln_isf ) CALL sbc_isf_div( hdivn ) !== ice shelf ==! (update hdivn field) 95 94 ! 96 IF( ln_iscpl .AND. ln_hsb ) CALL iscpl_div( hdivn )!== ice sheet ==! (update hdivn field)95 IF( ln_iscpl .AND. ln_hsb ) CALL iscpl_div( hdivn ) !== ice sheet ==! (update hdivn field) 97 96 ! 98 CALL lbc_lnk( hdivn, 'T', 1. ) !== lateral boundary cond. ==! (no sign change)97 CALL lbc_lnk( hdivn, 'T', 1. ) ! (no sign change) 99 98 ! 100 IF( nn_timing == 1 )CALL timing_stop('div_hor')99 IF( ln_timing ) CALL timing_stop('div_hor') 101 100 ! 102 101 END SUBROUTINE div_hor -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv.F90
r7646 r8568 7 7 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 8 8 !! 3.6 ! 2015-05 (N. Ducousso, G. Madec) add Hollingsworth scheme as an option 9 !! 4.0 ! 2017-07 (G. Madec) add a linear dynamics option 9 10 !!---------------------------------------------------------------------- 10 11 … … 30 31 31 32 ! !* namdyn_adv namelist * 32 LOGICAL, PUBLIC :: ln_dynadv_vec !: vector form flag 33 INTEGER, PUBLIC :: nn_dynkeg !: scheme of kinetic energy gradient: =0 C2 ; =1 Hollingsworth 33 LOGICAL, PUBLIC :: ln_dynadv_NONE !: linear dynamics (no momentum advection) 34 LOGICAL, PUBLIC :: ln_dynadv_vec !: vector form 35 INTEGER, PUBLIC :: nn_dynkeg !: scheme of grad(KE): =0 C2 ; =1 Hollingsworth 34 36 LOGICAL, PUBLIC :: ln_dynadv_cen2 !: flux form - 2nd order centered scheme flag 35 37 LOGICAL, PUBLIC :: ln_dynadv_ubs !: flux form - 3rd order UBS scheme flag 36 LOGICAL, PUBLIC :: ln_dynzad_zts !: vertical advection with sub-timestepping (requires vector form)37 38 38 INTEGER :: nadv ! choice of the formulation and scheme for the advection 39 INTEGER, PUBLIC :: n_dynadv !: choice of the formulation and scheme for momentum advection 40 ! ! associated indices: 41 INTEGER, PUBLIC, PARAMETER :: np_LIN_dyn = 0 ! no advection: linear dynamics 42 INTEGER, PUBLIC, PARAMETER :: np_VEC_c2 = 1 ! vector form : 2nd order centered scheme 43 INTEGER, PUBLIC, PARAMETER :: np_FLX_c2 = 2 ! flux form : 2nd order centered scheme 44 INTEGER, PUBLIC, PARAMETER :: np_FLX_ubs = 3 ! flux form : 3rd order Upstream Biased Scheme 39 45 40 46 !! * Substitutions 41 47 # include "vectopt_loop_substitute.h90" 42 48 !!---------------------------------------------------------------------- 43 !! NEMO/OPA 3.6 , NEMO Consortium (2015)49 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 44 50 !! $Id$ 45 51 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 53 59 !! ** Purpose : compute the ocean momentum advection trend. 54 60 !! 55 !! ** Method : - Update (ua,va) with the advection term following nadv 61 !! ** Method : - Update (ua,va) with the advection term following n_dynadv 62 !! 56 63 !! NB: in flux form advection (ln_dynadv_cen2 or ln_dynadv_ubs=T) 57 64 !! a metric term is add to the coriolis term while in vector form … … 62 69 !!---------------------------------------------------------------------- 63 70 ! 64 IF( nn_timing == 1 ) CALL timing_start('dyn_adv')71 IF( ln_timing ) CALL timing_start( 'dyn_adv' ) 65 72 ! 66 SELECT CASE ( nadv ) ! compute advection trend and add it to general trend 67 CASE ( 0 ) 68 CALL dyn_keg ( kt, nn_dynkeg ) ! vector form : horizontal gradient of kinetic energy 69 CALL dyn_zad ( kt ) ! vector form : vertical advection 70 CASE ( 1 ) 71 CALL dyn_keg ( kt, nn_dynkeg ) ! vector form : horizontal gradient of kinetic energy 72 CALL dyn_zad_zts ( kt ) ! vector form : vertical advection with sub-timestepping 73 CASE ( 2 ) 74 CALL dyn_adv_cen2( kt ) ! 2nd order centered scheme 75 CASE ( 3 ) 76 CALL dyn_adv_ubs ( kt ) ! 3rd order UBS scheme 73 SELECT CASE( n_dynadv ) !== compute advection trend and add it to general trend ==! 74 CASE( np_VEC_c2 ) 75 CALL dyn_keg ( kt, nn_dynkeg ) ! vector form : horizontal gradient of kinetic energy 76 CALL dyn_zad ( kt ) ! vector form : vertical advection 77 CASE( np_FLX_c2 ) 78 CALL dyn_adv_cen2( kt ) ! 2nd order centered scheme 79 CASE( np_FLX_ubs ) 80 CALL dyn_adv_ubs ( kt ) ! 3rd order UBS scheme (UP3) 77 81 END SELECT 78 82 ! 79 IF( nn_timing == 1 ) CALL timing_stop('dyn_adv')83 IF( ln_timing ) CALL timing_stop( 'dyn_adv' ) 80 84 ! 81 85 END SUBROUTINE dyn_adv … … 87 91 !! 88 92 !! ** Purpose : Control the consistency between namelist options for 89 !! momentum advection formulation & scheme and set n adv93 !! momentum advection formulation & scheme and set n_dynadv 90 94 !!---------------------------------------------------------------------- 91 95 INTEGER :: ioptio, ios ! Local integer 92 96 ! 93 NAMELIST/namdyn_adv/ ln_dynadv_ vec, nn_dynkeg, ln_dynadv_cen2 , ln_dynadv_ubs, ln_dynzad_zts97 NAMELIST/namdyn_adv/ ln_dynadv_NONE, ln_dynadv_vec, nn_dynkeg, ln_dynadv_cen2, ln_dynadv_ubs 94 98 !!---------------------------------------------------------------------- 95 99 ! … … 108 112 WRITE(numout,*) '~~~~~~~~~~~~' 109 113 WRITE(numout,*) ' Namelist namdyn_adv : chose a advection formulation & scheme for momentum' 110 WRITE(numout,*) ' Vector/flux form (T/F) ln_dynadv_vec = ', ln_dynadv_vec111 WRITE(numout,*) ' = 0 standard scheme ; =1 Hollingsworth scheme nn_dynkeg = ', nn_dynkeg112 WRITE(numout,*) ' 2nd order centred advection scheme ln_dynadv_cen2 = ', ln_dynadv_cen2113 WRITE(numout,*) ' 3rd order UBS advection scheme ln_dynadv_ubs = ', ln_dynadv_ubs114 WRITE(numout,*) ' Sub timestepping of vertical advection ln_dynzad_zts = ', ln_dynzad_zts114 WRITE(numout,*) ' linear dynamics : no momentum advection ln_dynadv_NONE = ', ln_dynadv_NONE 115 WRITE(numout,*) ' Vector form: 2nd order centered scheme ln_dynadv_vec = ', ln_dynadv_vec 116 WRITE(numout,*) ' with Hollingsworth scheme (=1) or not (=0) nn_dynkeg = ', nn_dynkeg 117 WRITE(numout,*) ' flux form: 2nd order centred scheme ln_dynadv_cen2 = ', ln_dynadv_cen2 118 WRITE(numout,*) ' 3rd order UBS scheme ln_dynadv_ubs = ', ln_dynadv_ubs 115 119 ENDIF 116 120 117 ioptio = 0 ! Parameter control 118 IF( ln_dynadv_vec ) ioptio = ioptio + 1 119 IF( ln_dynadv_cen2 ) ioptio = ioptio + 1 120 IF( ln_dynadv_ubs ) ioptio = ioptio + 1 121 ioptio = 0 ! parameter control and set n_dynadv 122 IF( ln_dynadv_NONE ) THEN ; ioptio = ioptio + 1 ; n_dynadv = np_LIN_dyn ; ENDIF 123 IF( ln_dynadv_vec ) THEN ; ioptio = ioptio + 1 ; n_dynadv = np_VEC_c2 ; ENDIF 124 IF( ln_dynadv_cen2 ) THEN ; ioptio = ioptio + 1 ; n_dynadv = np_FLX_c2 ; ENDIF 125 IF( ln_dynadv_ubs ) THEN ; ioptio = ioptio + 1 ; n_dynadv = np_FLX_ubs ; ENDIF 121 126 122 IF( ioptio /= 1 ) CALL ctl_stop( 'Choose ONE advection scheme in namelist namdyn_adv' ) 123 IF( ln_dynzad_zts .AND. .NOT. ln_dynadv_vec ) & 124 CALL ctl_stop( 'Sub timestepping of vertical advection requires vector form; set ln_dynadv_vec = .TRUE.' ) 125 IF( nn_dynkeg /= nkeg_C2 .AND. nn_dynkeg /= nkeg_HW ) & 126 CALL ctl_stop( 'KEG scheme wrong value of nn_dynkeg' ) 127 IF( ioptio /= 1 ) CALL ctl_stop( 'choose ONE and only ONE advection scheme' ) 128 IF( nn_dynkeg /= nkeg_C2 .AND. nn_dynkeg /= nkeg_HW ) CALL ctl_stop( 'KEG scheme wrong value of nn_dynkeg' ) 127 129 128 ! ! Set nadv129 IF( ln_dynadv_vec ) nadv = 0130 IF( ln_dynzad_zts ) nadv = 1131 IF( ln_dynadv_cen2 ) nadv = 2132 IF( ln_dynadv_ubs ) nadv = 3133 130 134 131 IF(lwp) THEN ! Print the choice 135 132 WRITE(numout,*) 136 IF( nadv == 0 ) WRITE(numout,*) ' ===>> vector form : keg + zad + vor is used'137 IF( nadv == 1 ) WRITE(numout,*) ' ===>> vector form : keg + zad_zts + vor isused'138 IF( nadv == 0 .OR. nadv == 1 ) THEN133 SELECT CASE( n_dynadv ) 134 CASE( np_LIN_dyn ) ; WRITE(numout,*) ' ===>> linear dynamics : no momentum advection used' 135 CASE( np_VEC_c2 ) ; WRITE(numout,*) ' ===>> vector form : keg + zad + vor is used' 139 136 IF( nn_dynkeg == nkeg_C2 ) WRITE(numout,*) ' with Centered standard keg scheme' 140 137 IF( nn_dynkeg == nkeg_HW ) WRITE(numout,*) ' with Hollingsworth keg scheme' 141 ENDIF142 IF( nadv == 2 ) WRITE(numout,*) ' ===>> flux form : 2nd orderscheme is used'143 IF( nadv == 3 ) WRITE(numout,*) ' ===>> flux form : UBS scheme is used'138 CASE( np_FLX_c2 ) ; WRITE(numout,*) ' ===>> flux form : 2nd order scheme is used' 139 CASE( np_FLX_ubs ) ; WRITE(numout,*) ' ===>> flux form : UBS scheme is used' 140 END SELECT 144 141 ENDIF 145 142 ! -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv_cen2.F90
r6750 r8568 20 20 USE lib_mpp ! MPP library 21 21 USE prtctl ! Print control 22 USE wrk_nemo ! Memory Allocation23 22 USE timing ! Timing 24 23 … … 31 30 # include "vectopt_loop_substitute.h90" 32 31 !!---------------------------------------------------------------------- 33 !! NEMO/OPA 4.0 , NEMO Consortium (201 1)32 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 34 33 !! $Id$ 35 34 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 51 50 ! 52 51 INTEGER :: ji, jj, jk ! dummy loop indices 53 REAL(wp), POINTER, DIMENSION(:,:,:) :: zfu_t, zfv_t, zfu_f, zfv_f, zfu_uw, zfv_vw, zfw54 REAL(wp), POINTER, DIMENSION(:,:,:) :: zfu, zfv52 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zfu_t, zfu_f, zfu_uw, zfu 53 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zfv_t, zfv_f, zfv_vw, zfv, zfw 55 54 !!---------------------------------------------------------------------- 56 55 ! 57 IF( nn_timing == 1 ) CALL timing_start('dyn_adv_cen2') 58 ! 59 CALL wrk_alloc( jpi,jpj,jpk, zfu_t, zfv_t, zfu_f, zfv_f, zfu_uw, zfv_vw, zfu, zfv, zfw ) 56 IF( ln_timing ) CALL timing_start('dyn_adv_cen2') 60 57 ! 61 58 IF( kt == nit000 .AND. lwp ) THEN … … 148 145 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 149 146 ! 150 CALL wrk_dealloc( jpi, jpj, jpk, zfu_t, zfv_t, zfu_f, zfv_f, zfu_uw, zfv_vw, zfu, zfv, zfw ) 151 ! 152 IF( nn_timing == 1 ) CALL timing_stop('dyn_adv_cen2') 147 IF( ln_timing ) CALL timing_stop('dyn_adv_cen2') 153 148 ! 154 149 END SUBROUTINE dyn_adv_cen2 -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv_ubs.F90
r6750 r8568 23 23 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 24 24 USE lib_mpp ! MPP library 25 USE wrk_nemo ! Memory Allocation26 25 USE timing ! Timing 27 26 … … 37 36 # include "vectopt_loop_substitute.h90" 38 37 !!---------------------------------------------------------------------- 39 !! NEMO/OPA 4.0 , NEMO Consortium (201 1)38 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 40 39 !! $Id$ 41 40 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 74 73 INTEGER :: ji, jj, jk ! dummy loop indices 75 74 REAL(wp) :: zui, zvj, zfuj, zfvi, zl_u, zl_v ! local scalars 76 REAL(wp), POINTER, DIMENSION(:,:,: ) :: zfu, zfv 77 REAL(wp), POINTER, DIMENSION(:,:,: ) :: zfu_t, zfv_t, zfu_f, zfv_f, zfu_uw, zfv_vw, zfw 78 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: zlu_uu, zlv_vv, zlu_uv, zlv_vu 75 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zfu_t, zfu_f, zfu_uw, zfu 76 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zfv_t, zfv_f, zfv_vw, zfv, zfw 77 REAL(wp), DIMENSION(jpi,jpj,jpk,2) :: zlu_uu, zlu_uv 78 REAL(wp), DIMENSION(jpi,jpj,jpk,2) :: zlv_vv, zlv_vu 79 79 !!---------------------------------------------------------------------- 80 80 ! 81 IF( nn_timing == 1 ) CALL timing_start('dyn_adv_ubs') 82 ! 83 CALL wrk_alloc( jpi,jpj,jpk, zfu_t , zfv_t , zfu_f , zfv_f, zfu_uw, zfv_vw, zfu, zfv, zfw ) 84 CALL wrk_alloc( jpi,jpj,jpk,jpts, zlu_uu, zlv_vv, zlu_uv, zlv_vu ) 81 IF( ln_timing ) CALL timing_start('dyn_adv_ubs') 85 82 ! 86 83 IF( kt == nit000 ) THEN … … 241 238 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 242 239 ! 243 CALL wrk_dealloc( jpi,jpj,jpk, zfu_t , zfv_t , zfu_f , zfv_f, zfu_uw, zfv_vw, zfu, zfv, zfw ) 244 CALL wrk_dealloc( jpi,jpj,jpk,jpts, zlu_uu, zlv_vv, zlu_uv, zlv_vu ) 245 ! 246 IF( nn_timing == 1 ) CALL timing_stop('dyn_adv_ubs') 240 IF( ln_timing ) CALL timing_stop('dyn_adv_ubs') 247 241 ! 248 242 END SUBROUTINE dyn_adv_ubs -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynbfr.F90
r8215 r8568 57 57 !!--------------------------------------------------------------------- 58 58 ! 59 IF( nn_timing == 1 )CALL timing_start('dyn_bfr')59 IF( ln_timing ) CALL timing_start('dyn_bfr') 60 60 ! 61 61 !!gm bug : time step is only rdt (not 2 rdt if euler start !) … … 109 109 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 110 110 ! 111 IF( nn_timing == 1 )CALL timing_stop('dyn_bfr')111 IF( ln_timing ) CALL timing_stop('dyn_bfr') 112 112 ! 113 113 END SUBROUTINE dyn_bfr -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90
r8215 r8568 44 44 USE lib_mpp ! MPP library 45 45 USE eosbn2 ! compute density 46 USE wrk_nemo ! Memory Allocation47 46 USE timing ! Timing 48 47 USE iom … … 84 83 !!---------------------------------------------------------------------- 85 84 INTEGER, INTENT(in) :: kt ! ocean time-step index 86 REAL(wp), POINTER, DIMENSION(:,:,:) ::ztrdu, ztrdv87 !!---------------------------------------------------------------------- 88 ! 89 IF( nn_timing == 1 )CALL timing_start('dyn_hpg')85 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv 86 !!---------------------------------------------------------------------- 87 ! 88 IF( ln_timing ) CALL timing_start('dyn_hpg') 90 89 ! 91 90 IF( l_trddyn ) THEN ! Temporary saving of ua and va trends (l_trddyn) 92 CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv)91 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 93 92 ztrdu(:,:,:) = ua(:,:,:) 94 93 ztrdv(:,:,:) = va(:,:,:) … … 108 107 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 109 108 CALL trd_dyn( ztrdu, ztrdv, jpdyn_hpg, kt ) 110 CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv )109 DEALLOCATE( ztrdu , ztrdv ) 111 110 ENDIF 112 111 ! … … 114 113 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 115 114 ! 116 IF( nn_timing == 1 )CALL timing_stop('dyn_hpg')115 IF( ln_timing ) CALL timing_stop('dyn_hpg') 117 116 ! 118 117 END SUBROUTINE dyn_hpg … … 134 133 INTEGER :: ji, jj, jk, ikt ! dummy loop indices ISF 135 134 REAL(wp) :: znad 136 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztstop, zrhd! hypothesys on isf density137 REAL(wp), POINTER, DIMENSION(:,:) :: zrhdtop_isf! density at bottom of ISF138 REAL(wp), POINTER, DIMENSION(:,:) :: ziceload! density at bottom of ISF135 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zts_top, zrhd ! hypothesys on isf density 136 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zrhdtop_isf ! density at bottom of ISF 137 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: ziceload ! density at bottom of ISF 139 138 !! 140 139 NAMELIST/namdyn_hpg/ ln_hpg_zco, ln_hpg_zps, ln_hpg_sco, & … … 165 164 ! 166 165 IF( ln_hpg_djc ) & 167 & CALL ctl_stop('dyn_hpg_init : Density Jacobian: Cubic polynominal method & 168 & currently disabled (bugs under investigation). Please select & 169 & either ln_hpg_sco or ln_hpg_prj instead') 170 ! 171 IF( .NOT.ln_linssh .AND. .NOT.(ln_hpg_sco.OR.ln_hpg_prj.OR.ln_hpg_isf) ) & 172 & CALL ctl_stop('dyn_hpg_init : non-linear free surface requires either ', & 173 & ' the standard jacobian formulation hpg_sco or ' , & 174 & ' the pressure jacobian formulation hpg_prj' ) 175 176 IF( ln_hpg_isf .AND. .NOT. ln_isfcav ) & 177 & CALL ctl_stop( ' hpg_isf not available if ln_isfcav = false ' ) 178 IF( .NOT. ln_hpg_isf .AND. ln_isfcav ) & 179 & CALL ctl_stop( 'Only hpg_isf has been corrected to work with ice shelf cavity.' ) 166 & CALL ctl_stop('dyn_hpg_init : Density Jacobian: Cubic polynominal method', & 167 & ' currently disabled (bugs under investigation).' , & 168 & ' Please select either ln_hpg_sco or ln_hpg_prj instead' ) 169 ! 170 IF( .NOT.ln_linssh .AND. .NOT.(ln_hpg_sco.OR.ln_hpg_prj.OR.ln_hpg_isf) ) & 171 & CALL ctl_stop('dyn_hpg_init : non-linear free surface requires either ', & 172 & ' the standard jacobian formulation hpg_sco or ' , & 173 & ' the pressure jacobian formulation hpg_prj' ) 174 ! 175 IF( ln_hpg_isf ) THEN 176 IF( .NOT. ln_isfcav ) CALL ctl_stop( ' hpg_isf not available if ln_isfcav = false ' ) 177 ELSE 178 IF( ln_isfcav ) CALL ctl_stop( 'Only hpg_isf has been corrected to work with ice shelf cavity.' ) 179 ENDIF 180 180 ! 181 181 ! ! Set nhpg from ln_hpg_... flags … … 197 197 IF( ioptio /= 1 ) CALL ctl_stop( 'NO or several hydrostatic pressure gradient options used' ) 198 198 ! 199 ! initialisation of ice shelf load 200 IF ( .NOT. ln_isfcav ) riceload(:,:)=0.0 201 IF ( ln_isfcav ) THEN 202 CALL wrk_alloc( jpi,jpj, 2, ztstop) 203 CALL wrk_alloc( jpi,jpj,jpk, zrhd ) 204 CALL wrk_alloc( jpi,jpj, zrhdtop_isf, ziceload) 199 ! 200 IF ( .NOT. ln_isfcav ) THEN !--- no ice shelf load 201 riceload(:,:) = 0._wp 202 ! 203 ELSE !--- set an ice shelf load 205 204 ! 206 205 IF(lwp) WRITE(numout,*) 207 IF(lwp) WRITE(numout,*) 'dyn:hpg_isf : hydrostatic pressure gradient trend for ice shelf' 208 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 209 210 ! To use density and not density anomaly 211 znad=1._wp 212 213 ! assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude) 214 ztstop(:,:,1)=-1.9_wp ; ztstop(:,:,2)=34.4_wp 215 216 ! compute density of the water displaced by the ice shelf 217 DO jk = 1, jpk 218 CALL eos(ztstop(:,:,:),gdept_n(:,:,jk),zrhd(:,:,jk)) 219 END DO 220 221 ! compute rhd at the ice/oce interface (ice shelf side) 222 CALL eos(ztstop,risfdep,zrhdtop_isf) 223 224 ! Surface value + ice shelf gradient 225 ! compute pressure due to ice shelf load (used to compute hpgi/j for all the level from 1 to miku/v) 226 ! divided by 2 later 227 ziceload = 0._wp 228 DO jj = 1, jpj 229 DO ji = 1, jpi 230 ikt=mikt(ji,jj) 206 IF(lwp) WRITE(numout,*) ' ice shelf case: set the ice-shelf load' 207 ALLOCATE( zts_top(jpi,jpj,jpts) , zrhd(jpi,jpj,jpk) , zrhdtop_isf(jpi,jpj) , ziceload(jpi,jpj) ) 208 ! 209 znad = 1._wp !- To use density and not density anomaly 210 ! 211 ! !- assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude) 212 zts_top(:,:,jp_tem) = -1.9_wp ; zts_top(:,:,jp_sal) = 34.4_wp 213 ! 214 DO jk = 1, jpk !- compute density of the water displaced by the ice shelf 215 CALL eos( zts_top(:,:,:), gdept_n(:,:,jk), zrhd(:,:,jk) ) 216 END DO 217 ! 218 ! !- compute rhd at the ice/oce interface (ice shelf side) 219 CALL eos( zts_top , risfdep, zrhdtop_isf ) 220 ! 221 ! !- Surface value + ice shelf gradient 222 ziceload = 0._wp ! compute pressure due to ice shelf load 223 DO jj = 1, jpj ! (used to compute hpgi/j for all the level from 1 to miku/v) 224 DO ji = 1, jpi ! divided by 2 later 225 ikt = mikt(ji,jj) 231 226 ziceload(ji,jj) = ziceload(ji,jj) + (znad + zrhd(ji,jj,1) ) * e3w_n(ji,jj,1) * (1._wp - tmask(ji,jj,1)) 232 DO jk =2,ikt-1227 DO jk = 2, ikt-1 233 228 ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhd(ji,jj,jk-1) + zrhd(ji,jj,jk)) * e3w_n(ji,jj,jk) & 234 229 & * (1._wp - tmask(ji,jj,jk)) 235 230 END DO 236 231 IF (ikt >= 2) ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhdtop_isf(ji,jj) + zrhd(ji,jj,ikt-1)) & 237 & * ( risfdep(ji,jj) - gdept_1d(ikt-1) ) 238 END DO 239 END DO 240 riceload(:,:)=ziceload(:,:) ! need to be saved for diaar5 241 242 CALL wrk_dealloc( jpi,jpj, 2, ztstop) 243 CALL wrk_dealloc( jpi,jpj,jpk, zrhd ) 244 CALL wrk_dealloc( jpi,jpj, zrhdtop_isf, ziceload) 245 END IF 232 & * ( risfdep(ji,jj) - gdept_1d(ikt-1) ) 233 END DO 234 END DO 235 riceload(:,:) = ziceload(:,:) ! need to be saved for diaar5 236 ! 237 DEALLOCATE( zts_top , zrhd , zrhdtop_isf , ziceload ) 238 ENDIF 246 239 ! 247 240 END SUBROUTINE dyn_hpg_init … … 268 261 INTEGER :: ji, jj, jk ! dummy loop indices 269 262 REAL(wp) :: zcoef0, zcoef1 ! temporary scalars 270 REAL(wp), POINTER, DIMENSION(:,:,:) :: zhpi, zhpj 271 !!---------------------------------------------------------------------- 272 ! 273 CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 263 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhpi, zhpj 264 !!---------------------------------------------------------------------- 274 265 ! 275 266 IF( kt == nit000 ) THEN … … 315 306 END DO 316 307 ! 317 CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj )318 !319 308 END SUBROUTINE hpg_zco 320 309 … … 333 322 INTEGER :: iku, ikv ! temporary integers 334 323 REAL(wp) :: zcoef0, zcoef1, zcoef2, zcoef3 ! temporary scalars 335 REAL(wp), POINTER, DIMENSION(:,:,:) :: zhpi, zhpj 336 !!---------------------------------------------------------------------- 337 ! 338 CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 324 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhpi, zhpj 325 !!---------------------------------------------------------------------- 339 326 ! 340 327 IF( kt == nit000 ) THEN … … 405 392 END DO 406 393 ! 407 CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj )408 !409 394 END SUBROUTINE hpg_zps 410 395 … … 433 418 REAL(wp) :: zcoef0, zuap, zvap, znad, ztmp ! temporary scalars 434 419 LOGICAL :: ll_tmp1, ll_tmp2 ! local logical variables 435 REAL(wp), POINTER, DIMENSION(:,:,:) :: zhpi, zhpj 436 REAL(wp), POINTER, DIMENSION(:,:) :: zcpx, zcpy !W/D pressure filter 437 !!---------------------------------------------------------------------- 438 ! 439 CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 440 IF( ln_wd ) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 420 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhpi, zhpj 421 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zcpx, zcpy !W/D pressure filter 422 !!---------------------------------------------------------------------- 441 423 ! 442 424 IF( kt == nit000 ) THEN … … 452 434 ! 453 435 IF( ln_wd ) THEN 454 DO jj = 2, jpjm1 455 DO ji = 2, jpim1 456 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji+1,jj) ) > & 436 ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 437 DO jj = 2, jpjm1 438 DO ji = 2, jpim1 439 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji+1,jj) ) > & 457 440 & MAX( -ht_wd(ji,jj) , -ht_wd(ji+1,jj) ) .AND. & 458 441 & MAX( sshn(ji,jj) + ht_wd(ji,jj), sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 459 442 & > rn_wdmin1 + rn_wdmin2 460 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji+1,jj) ) > 1.E-12 ) .AND. ( &443 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji+1,jj) ) > 1.E-12 ) .AND. ( & 461 444 & MAX( sshn(ji,jj) , sshn(ji+1,jj) ) > & 462 445 & MAX( -ht_wd(ji,jj) , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 463 446 464 IF(ll_tmp1) THEN465 zcpx(ji,jj) = 1.0_wp466 ELSE IF(ll_tmp2) THEN467 ! no worries about sshn(ji+1,jj) - sshn(ji ,jj) = 0, it won't happen ! here468 zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj))&469 & / (sshn(ji+1,jj) - sshn(ji ,jj)))470 ELSE471 zcpx(ji,jj) = 0._wp472 ENDIF473 474 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji,jj+1) ) > &447 IF(ll_tmp1) THEN 448 zcpx(ji,jj) = 1.0_wp 449 ELSE IF(ll_tmp2) THEN 450 ! no worries about sshn(ji+1,jj) - sshn(ji ,jj) = 0, it won't happen ! here 451 zcpx(ji,jj) = ABS( ( sshn(ji+1,jj)+ht_wd(ji+1,jj) - sshn(ji,jj)-ht_wd(ji,jj) ) & 452 & / ( sshn(ji+1,jj) - sshn(ji,jj) ) ) 453 ELSE 454 zcpx(ji,jj) = 0._wp 455 ENDIF 456 ! 457 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji,jj+1) ) > & 475 458 & MAX( -ht_wd(ji,jj) , -ht_wd(ji,jj+1) ) .AND. & 476 459 & MAX( sshn(ji,jj) + ht_wd(ji,jj), sshn(ji,jj+1) + ht_wd(ji,jj+1) ) & 477 460 & > rn_wdmin1 + rn_wdmin2 478 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji,jj+1) ) > 1.E-12 ) .AND. ( &461 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji,jj+1) ) > 1.E-12 ) .AND. ( & 479 462 & MAX( sshn(ji,jj) , sshn(ji,jj+1) ) > & 480 463 & MAX( -ht_wd(ji,jj) , -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 481 482 IF(ll_tmp1) THEN483 zcpy(ji,jj) = 1.0_wp484 ELSE IF(ll_tmp2) THEN485 ! no worries about sshn(ji,jj+1) - sshn(ji,jj ) = 0, it won't happen ! here486 zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj))&487 & / (sshn(ji,jj+1) - sshn(ji,jj )))488 ELSE489 zcpy(ji,jj) = 0._wp490 ENDIF491 END DO492 END DO493 CALL lbc_lnk( zcpx, 'U', 1._wp ) ; CALL lbc_lnk( zcpy, 'V', 1._wp )494 END 464 ! 465 IF(ll_tmp1) THEN 466 zcpy(ji,jj) = 1.0_wp 467 ELSE IF(ll_tmp2) THEN 468 ! no worries about sshn(ji,jj+1) - sshn(ji,jj ) = 0, it won't happen ! here 469 zcpy(ji,jj) = ABS( ( sshn(ji,jj+1)+ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj) ) & 470 & / ( sshn(ji,jj+1) - sshn(ji,jj) ) ) 471 ELSE 472 zcpy(ji,jj) = 0._wp 473 ENDIF 474 END DO 475 END DO 476 CALL lbc_lnk( zcpx, 'U', 1._wp ) ; CALL lbc_lnk( zcpy, 'V', 1._wp ) 477 ENDIF 495 478 496 479 ! Surface value … … 507 490 zvap = -zcoef0 * ( rhd (ji,jj+1,1) + rhd (ji,jj,1) + 2._wp * znad ) & 508 491 & * ( gde3w_n(ji,jj+1,1) - gde3w_n(ji,jj,1) ) * r1_e2v(ji,jj) 509 510 492 ! 511 493 IF( ln_wd ) THEN 512 513 zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 514 zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj) 515 zuap = zuap * zcpx(ji,jj) 516 zvap = zvap * zcpy(ji,jj) 494 zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 495 zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj) 496 zuap = zuap * zcpx(ji,jj) 497 zvap = zvap * zcpy(ji,jj) 517 498 ENDIF 518 499 ! 519 500 ! add to the general momentum trend 520 501 ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap … … 539 520 zvap = -zcoef0 * ( rhd (ji ,jj+1,jk) + rhd (ji,jj,jk) + 2._wp * znad ) & 540 521 & * ( gde3w_n(ji ,jj+1,jk) - gde3w_n(ji,jj,jk) ) * r1_e2v(ji,jj) 541 522 ! 542 523 IF( ln_wd ) THEN 543 zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj)544 zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)545 zuap = zuap * zcpx(ji,jj)546 zvap = zvap * zcpy(ji,jj)547 ENDIF 548 524 zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 525 zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj) 526 zuap = zuap * zcpx(ji,jj) 527 zvap = zvap * zcpy(ji,jj) 528 ENDIF 529 ! 549 530 ! add to the general momentum trend 550 531 ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) + zuap … … 554 535 END DO 555 536 ! 556 CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj ) 557 IF( ln_wd ) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 537 IF( ln_wd ) DEALLOCATE( zcpx , zcpy ) 558 538 ! 559 539 END SUBROUTINE hpg_sco … … 583 563 INTEGER :: ji, jj, jk, ikt, iktp1i, iktp1j ! dummy loop indices 584 564 REAL(wp) :: zcoef0, zuap, zvap, znad ! temporary scalars 585 REAL(wp), POINTER, DIMENSION(:,:,:) :: zhpi, zhpj 586 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztstop 587 REAL(wp), POINTER, DIMENSION(:,:) :: zrhdtop_oce 588 !!---------------------------------------------------------------------- 589 ! 590 CALL wrk_alloc( jpi,jpj, 2, ztstop) 591 CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj) 592 CALL wrk_alloc( jpi,jpj, zrhdtop_oce ) 593 ! 594 ! Local constant initialization 595 zcoef0 = - grav * 0.5_wp 596 597 ! To use density and not density anomaly 598 znad=1._wp 599 600 ! iniitialised to 0. zhpi zhpi 601 zhpi(:,:,:)=0._wp ; zhpj(:,:,:)=0._wp 565 REAL(wp), DIMENSION(jpi,jpj,jpk ) :: zhpi, zhpj 566 REAL(wp), DIMENSION(jpi,jpj,jpts) :: zts_top 567 REAL(wp), DIMENSION(jpi,jpj) :: zrhdtop_oce 568 !!---------------------------------------------------------------------- 569 ! 570 zcoef0 = - grav * 0.5_wp ! Local constant initialization 571 ! 572 znad=1._wp ! To use density and not density anomaly 573 ! 574 ! ! iniitialised to 0. zhpi zhpi 575 zhpi(:,:,:) = 0._wp ; zhpj(:,:,:) = 0._wp 602 576 603 577 ! compute rhd at the ice/oce interface (ocean side) 604 578 ! usefull to reduce residual current in the test case ISOMIP with no melting 605 DO ji =1,jpi606 DO jj =1,jpj607 ikt =mikt(ji,jj)608 zts top(ji,jj,1)=tsn(ji,jj,ikt,1)609 zts top(ji,jj,2)=tsn(ji,jj,ikt,2)579 DO ji = 1, jpi 580 DO jj = 1, jpj 581 ikt = mikt(ji,jj) 582 zts_top(ji,jj,1) = tsn(ji,jj,ikt,1) 583 zts_top(ji,jj,2) = tsn(ji,jj,ikt,2) 610 584 END DO 611 585 END DO 612 CALL eos( zts top, risfdep, zrhdtop_oce )586 CALL eos( zts_top, risfdep, zrhdtop_oce ) 613 587 614 588 !================================================================================== … … 667 641 END DO 668 642 END DO 669 !670 CALL wrk_dealloc( jpi,jpj,2 , ztstop)671 CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj)672 CALL wrk_dealloc( jpi,jpj , zrhdtop_oce )673 643 ! 674 644 END SUBROUTINE hpg_isf … … 690 660 REAL(wp) :: z1_12, cffv, cffy ! " " 691 661 LOGICAL :: ll_tmp1, ll_tmp2 ! local logical variables 692 REAL(wp), POINTER, DIMENSION(:,:,:) :: zhpi, zhpj 693 REAL(wp), POINTER, DIMENSION(:,:,:) :: dzx, dzy, dzz, dzu, dzv, dzw 694 REAL(wp), POINTER, DIMENSION(:,:,:) :: drhox, drhoy, drhoz, drhou, drhov, drhow 695 REAL(wp), POINTER, DIMENSION(:,:,:) :: rho_i, rho_j, rho_k 696 REAL(wp), POINTER, DIMENSION(:,:) :: zcpx, zcpy !W/D pressure filter 697 !!---------------------------------------------------------------------- 698 ! 699 CALL wrk_alloc( jpi, jpj, jpk, dzx , dzy , dzz , dzu , dzv , dzw ) 700 CALL wrk_alloc( jpi, jpj, jpk, drhox, drhoy, drhoz, drhou, drhov, drhow ) 701 CALL wrk_alloc( jpi, jpj, jpk, rho_i, rho_j, rho_k, zhpi, zhpj ) 702 IF( ln_wd ) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 703 ! 662 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhpi, zhpj 663 REAL(wp), DIMENSION(jpi,jpj,jpk) :: dzx, dzy, dzz, dzu, dzv, dzw 664 REAL(wp), DIMENSION(jpi,jpj,jpk) :: drhox, drhoy, drhoz, drhou, drhov, drhow 665 REAL(wp), DIMENSION(jpi,jpj,jpk) :: rho_i, rho_j, rho_k 666 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zcpx, zcpy !W/D pressure filter 667 !!---------------------------------------------------------------------- 704 668 ! 705 669 IF( ln_wd ) THEN 706 DO jj = 2, jpjm1 707 DO ji = 2, jpim1 708 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji+1,jj) ) > & 670 ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 671 DO jj = 2, jpjm1 672 DO ji = 2, jpim1 673 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji+1,jj) ) > & 709 674 & MAX( -ht_wd(ji,jj) , -ht_wd(ji+1,jj) ) .AND. & 710 675 & MAX( sshn(ji,jj) + ht_wd(ji,jj), sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 711 676 & > rn_wdmin1 + rn_wdmin2 712 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji+1,jj) ) > 1.E-12 ) .AND. ( &677 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji+1,jj) ) > 1.E-12 ) .AND. ( & 713 678 & MAX( sshn(ji,jj) , sshn(ji+1,jj) ) > & 714 679 & MAX( -ht_wd(ji,jj) , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 715 680 716 IF(ll_tmp1) THEN717 zcpx(ji,jj) = 1.0_wp718 ELSE IF(ll_tmp2) THEN719 ! no worries about sshn(ji+1,jj) - sshn(ji ,jj) = 0, it won't happen ! here720 zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) &721 & / (sshn(ji+1,jj) - sshn(ji ,jj)) )722 ELSE723 zcpx(ji,jj) = 0._wp724 ENDIF681 IF(ll_tmp1) THEN 682 zcpx(ji,jj) = 1.0_wp 683 ELSE IF(ll_tmp2) THEN 684 ! no worries about sshn(ji+1,jj) - sshn(ji ,jj) = 0, it won't happen ! here 685 zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 686 & / (sshn(ji+1,jj) - sshn(ji ,jj)) ) 687 ELSE 688 zcpx(ji,jj) = 0._wp 689 ENDIF 725 690 726 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji,jj+1) ) > &691 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji,jj+1) ) > & 727 692 & MAX( -ht_wd(ji,jj) , -ht_wd(ji,jj+1) ) .AND. & 728 693 & MAX( sshn(ji,jj) + ht_wd(ji,jj), sshn(ji,jj+1) + ht_wd(ji,jj+1) ) & 729 694 & > rn_wdmin1 + rn_wdmin2 730 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji,jj+1) ) > 1.E-12 ) .AND. ( &695 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji,jj+1) ) > 1.E-12 ) .AND. ( & 731 696 & MAX( sshn(ji,jj) , sshn(ji,jj+1) ) > & 732 697 & MAX( -ht_wd(ji,jj) , -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 733 698 734 IF(ll_tmp1) THEN735 zcpy(ji,jj) = 1.0_wp736 ELSE IF(ll_tmp2) THEN737 ! no worries about sshn(ji,jj+1) - sshn(ji,jj ) = 0, it won't happen ! here738 zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) &739 & / (sshn(ji,jj+1) - sshn(ji,jj )) )740 ELSE741 zcpy(ji,jj) = 0._wp742 ENDIF743 END DO744 END DO745 CALL lbc_lnk( zcpx, 'U', 1._wp ) ; CALL lbc_lnk( zcpy, 'V', 1._wp )746 END 699 IF(ll_tmp1) THEN 700 zcpy(ji,jj) = 1.0_wp 701 ELSE IF(ll_tmp2) THEN 702 ! no worries about sshn(ji,jj+1) - sshn(ji,jj ) = 0, it won't happen ! here 703 zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 704 & / (sshn(ji,jj+1) - sshn(ji,jj )) ) 705 ELSE 706 zcpy(ji,jj) = 0._wp 707 ENDIF 708 END DO 709 END DO 710 CALL lbc_lnk( zcpx, 'U', 1._wp ) ; CALL lbc_lnk( zcpy, 'V', 1._wp ) 711 ENDIF 747 712 748 713 IF( kt == nit000 ) THEN … … 903 868 END DO 904 869 END DO 905 CALL lbc_lnk( rho_k,'W',1.)906 CALL lbc_lnk( rho_i,'U',1.)907 CALL lbc_lnk( rho_j,'V',1.)870 CALL lbc_lnk( rho_k, 'W', 1. ) 871 CALL lbc_lnk( rho_i, 'U', 1. ) 872 CALL lbc_lnk( rho_j, 'V', 1. ) 908 873 909 874 … … 949 914 END DO 950 915 ! 951 CALL wrk_dealloc( jpi, jpj, jpk, dzx , dzy , dzz , dzu , dzv , dzw ) 952 CALL wrk_dealloc( jpi, jpj, jpk, drhox, drhoy, drhoz, drhou, drhov, drhow ) 953 CALL wrk_dealloc( jpi, jpj, jpk, rho_i, rho_j, rho_k, zhpi, zhpj ) 954 IF( ln_wd ) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 916 IF( ln_wd ) DEALLOCATE( zcpx, zcpy ) 955 917 ! 956 918 END SUBROUTINE hpg_djc … … 980 942 REAL(wp) :: zrhdt1 981 943 REAL(wp) :: zdpdx1, zdpdx2, zdpdy1, zdpdy2 982 REAL(wp), POINTER, DIMENSION(:,:,:) :: zdept, zrhh 983 REAL(wp), POINTER, DIMENSION(:,:,:) :: zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 984 REAL(wp), POINTER, DIMENSION(:,:) :: zsshu_n, zsshv_n 985 REAL(wp), POINTER, DIMENSION(:,:) :: zcpx, zcpy !W/D pressure filter 986 !!---------------------------------------------------------------------- 987 ! 988 CALL wrk_alloc( jpi,jpj,jpk, zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 989 CALL wrk_alloc( jpi,jpj,jpk, zdept, zrhh ) 990 CALL wrk_alloc( jpi,jpj, zsshu_n, zsshv_n ) 991 IF( ln_wd ) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 944 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdept, zrhh 945 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 946 REAL(wp), DIMENSION(jpi,jpj) :: zsshu_n, zsshv_n 947 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zcpx, zcpy !W/D pressure filter 948 !!---------------------------------------------------------------------- 992 949 ! 993 950 IF( kt == nit000 ) THEN … … 1003 960 1004 961 IF( ln_wd ) THEN 1005 DO jj = 2, jpjm1 1006 DO ji = 2, jpim1 1007 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji+1,jj) ) > & 962 ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 963 DO jj = 2, jpjm1 964 DO ji = 2, jpim1 965 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji+1,jj) ) > & 1008 966 & MAX( -ht_wd(ji,jj) , -ht_wd(ji+1,jj) ) .AND. & 1009 967 & MAX( sshn(ji,jj) + ht_wd(ji,jj), sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 1010 968 & > rn_wdmin1 + rn_wdmin2 1011 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji+1,jj) ) > 1.E-12 ) .AND. ( &969 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji+1,jj) ) > 1.E-12 ) .AND. ( & 1012 970 & MAX( sshn(ji,jj) , sshn(ji+1,jj) ) > & 1013 971 & MAX( -ht_wd(ji,jj) , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 1014 972 1015 IF(ll_tmp1) THEN1016 zcpx(ji,jj) = 1.0_wp1017 ELSE IF(ll_tmp2) THEN1018 ! no worries about sshn(ji+1,jj) - sshn(ji ,jj) = 0, it won't happen ! here1019 zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) &1020 & / (sshn(ji+1,jj) - sshn(ji ,jj)) )1021 ELSE1022 zcpx(ji,jj) = 0._wp1023 ENDIF973 IF(ll_tmp1) THEN 974 zcpx(ji,jj) = 1.0_wp 975 ELSE IF(ll_tmp2) THEN 976 ! no worries about sshn(ji+1,jj) - sshn(ji ,jj) = 0, it won't happen ! here 977 zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 978 & / (sshn(ji+1,jj) - sshn(ji ,jj)) ) 979 ELSE 980 zcpx(ji,jj) = 0._wp 981 ENDIF 1024 982 1025 ll_tmp1 = MIN( sshn(ji,jj), sshn(ji,jj+1) ) > &983 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji,jj+1) ) > & 1026 984 & MAX( -ht_wd(ji,jj) , -ht_wd(ji,jj+1) ) .AND. & 1027 985 & MAX( sshn(ji,jj) + ht_wd(ji,jj), sshn(ji,jj+1) + ht_wd(ji,jj+1) ) & 1028 986 & > rn_wdmin1 + rn_wdmin2 1029 ll_tmp2 = ( ABS( sshn(ji,jj)- sshn(ji,jj+1) ) > 1.E-12 ) .AND. ( &987 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji,jj+1) ) > 1.E-12 ) .AND. ( & 1030 988 & MAX( sshn(ji,jj) , sshn(ji,jj+1) ) > & 1031 989 & MAX( -ht_wd(ji,jj) , -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 1032 990 1033 IF(ll_tmp1) THEN1034 zcpy(ji,jj) = 1.0_wp1035 ELSE IF(ll_tmp2) THEN1036 ! no worries about sshn(ji,jj+1) - sshn(ji,jj ) = 0, it won't happen ! here1037 zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) &991 IF(ll_tmp1) THEN 992 zcpy(ji,jj) = 1.0_wp 993 ELSE IF(ll_tmp2) THEN 994 ! no worries about sshn(ji,jj+1) - sshn(ji,jj ) = 0, it won't happen ! here 995 zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 1038 996 & / (sshn(ji,jj+1) - sshn(ji,jj )) ) 1039 ELSE1040 zcpy(ji,jj) = 0._wp1041 ENDIF1042 END DO1043 END DO1044 CALL lbc_lnk( zcpx, 'U', 1._wp ) ; CALL lbc_lnk( zcpy, 'V', 1._wp )1045 END 997 ELSE 998 zcpy(ji,jj) = 0._wp 999 ENDIF 1000 END DO 1001 END DO 1002 CALL lbc_lnk( zcpx, 'U', 1._wp ) ; CALL lbc_lnk( zcpy, 'V', 1._wp ) 1003 ENDIF 1046 1004 1047 1005 ! Clean 3-D work arrays … … 1298 1256 END DO 1299 1257 ! 1300 CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 1301 CALL wrk_dealloc( jpi,jpj,jpk, zdept, zrhh ) 1302 CALL wrk_dealloc( jpi,jpj, zsshu_n, zsshv_n ) 1303 IF( ln_wd ) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 1258 IF( ln_wd ) DEALLOCATE( zcpx, zcpy ) 1304 1259 ! 1305 1260 END SUBROUTINE hpg_prj … … 1353 1308 !!Simply geometric average 1354 1309 DO jk = 2, jpkm1-1 1355 zdf1 = (fsp(ji,jj,jk ) - fsp(ji,jj,jk-1)) / (xsp(ji,jj,jk) - xsp(ji,jj,jk-1))1356 zdf2 = (fsp(ji,jj,jk+1) - fsp(ji,jj,jk )) / (xsp(ji,jj,jk+1) - xsp(ji,jj,jk))1310 zdf1 = (fsp(ji,jj,jk ) - fsp(ji,jj,jk-1)) / (xsp(ji,jj,jk ) - xsp(ji,jj,jk-1)) 1311 zdf2 = (fsp(ji,jj,jk+1) - fsp(ji,jj,jk )) / (xsp(ji,jj,jk+1) - xsp(ji,jj,jk )) 1357 1312 1358 1313 IF(zdf1 * zdf2 <= 0._wp) THEN … … 1403 1358 END DO 1404 1359 END DO 1405 1360 ! 1406 1361 ELSE 1407 1408 ENDIF 1409 1362 CALL ctl_stop( 'invalid polynomial type in cspline' ) 1363 ENDIF 1364 ! 1410 1365 END SUBROUTINE cspline 1411 1366 -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynkeg.F90
r7753 r8568 22 22 USE lib_mpp ! MPP library 23 23 USE prtctl ! Print control 24 USE wrk_nemo ! Memory Allocation25 24 USE timing ! Timing 26 25 USE bdy_oce ! ocean open boundary conditions … … 39 38 # include "vectopt_loop_substitute.h90" 40 39 !!---------------------------------------------------------------------- 41 !! NEMO/OPA 3.6 , NEMO Consortium (2015)40 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 42 41 !! $Id$ 43 42 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 75 74 INTEGER, INTENT( in ) :: kscheme ! =0/1 type of KEG scheme 76 75 ! 77 INTEGER :: ji, jj, jk ! dummy loop indices 78 REAL(wp) :: zu, zv ! temporary scalars 79 REAL(wp), POINTER, DIMENSION(:,:,:) :: zhke 80 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 81 INTEGER :: jb ! dummy loop indices 82 INTEGER :: ii, ij, igrd, ib_bdy ! local integers 83 INTEGER :: fu, fv 76 INTEGER :: ji, jj, jk, jb ! dummy loop indices 77 INTEGER :: ii, ifu, ib_bdy ! local integers 78 INTEGER :: ij, ifv, igrd ! - - 79 REAL(wp) :: zu, zv ! local scalars 80 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhke 81 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv 84 82 !!---------------------------------------------------------------------- 85 83 ! 86 IF( nn_timing == 1 ) CALL timing_start('dyn_keg') 87 ! 88 CALL wrk_alloc( jpi,jpj,jpk, zhke ) 84 IF( ln_timing ) CALL timing_start('dyn_keg') 89 85 ! 90 86 IF( kt == nit000 ) THEN … … 94 90 ENDIF 95 91 96 IF( l_trddyn ) THEN ! Save ua and vatrends97 CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv)92 IF( l_trddyn ) THEN ! Save the input trends 93 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 98 94 ztrdu(:,:,:) = ua(:,:,:) 99 95 ztrdv(:,:,:) = va(:,:,:) … … 112 108 ii = idx_bdy(ib_bdy)%nbi(jb,igrd) 113 109 ij = idx_bdy(ib_bdy)%nbj(jb,igrd) 114 fu = NINT( idx_bdy(ib_bdy)%flagu(jb,igrd) )115 un(ii- fu,ij,jk) = un(ii,ij,jk) * umask(ii,ij,jk)110 ifu = NINT( idx_bdy(ib_bdy)%flagu(jb,igrd) ) 111 un(ii-ifu,ij,jk) = un(ii,ij,jk) * umask(ii,ij,jk) 116 112 END DO 117 113 END DO … … 122 118 ii = idx_bdy(ib_bdy)%nbi(jb,igrd) 123 119 ij = idx_bdy(ib_bdy)%nbj(jb,igrd) 124 fv = NINT( idx_bdy(ib_bdy)%flagv(jb,igrd) )125 vn(ii,ij- fv,jk) = vn(ii,ij,jk) * vmask(ii,ij,jk)120 ifv = NINT( idx_bdy(ib_bdy)%flagv(jb,igrd) ) 121 vn(ii,ij-ifv,jk) = vn(ii,ij,jk) * vmask(ii,ij,jk) 126 122 END DO 127 123 END DO … … 172 168 ENDIF 173 169 174 175 170 ! 176 171 DO jk = 1, jpkm1 !== grad( KE ) added to the general momentum trends ==! … … 187 182 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 188 183 CALL trd_dyn( ztrdu, ztrdv, jpdyn_keg, kt ) 189 CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv )184 DEALLOCATE( ztrdu , ztrdv ) 190 185 ENDIF 191 186 ! … … 193 188 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 194 189 ! 195 CALL wrk_dealloc( jpi,jpj,jpk, zhke ) 196 ! 197 IF( nn_timing == 1 ) CALL timing_stop('dyn_keg') 190 IF( ln_timing ) CALL timing_stop('dyn_keg') 198 191 ! 199 192 END SUBROUTINE dyn_keg -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90
r8215 r8568 27 27 USE lib_mpp ! distribued memory computing library 28 28 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 29 USE wrk_nemo ! Memory Allocation30 29 USE timing ! Timing 31 30 … … 48 47 # include "vectopt_loop_substitute.h90" 49 48 !!---------------------------------------------------------------------- 50 !! NEMO/OPA 3.7 , NEMO Consortium (2015)49 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 51 50 !! $Id$ 52 51 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 62 61 INTEGER, INTENT(in) :: kt ! ocean time-step index 63 62 ! 64 REAL(wp), POINTER, DIMENSION(:,:,:) ::ztrdu, ztrdv63 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv 65 64 !!---------------------------------------------------------------------- 66 65 ! 67 IF( nn_timing == 1 )CALL timing_start('dyn_ldf')66 IF( ln_timing ) CALL timing_start('dyn_ldf') 68 67 ! 69 68 IF( l_trddyn ) THEN ! temporary save of momentum trends 70 CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv)69 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 71 70 ztrdu(:,:,:) = ua(:,:,:) 72 71 ztrdv(:,:,:) = va(:,:,:) … … 85 84 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 86 85 CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt ) 87 CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv )86 DEALLOCATE ( ztrdu , ztrdv ) 88 87 ENDIF 89 88 ! ! print sum trends (used for debugging) … … 91 90 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 92 91 ! 93 IF( nn_timing == 1 )CALL timing_stop('dyn_ldf')92 IF( ln_timing ) CALL timing_stop('dyn_ldf') 94 93 ! 95 94 END SUBROUTINE dyn_ldf … … 102 101 !! ** Purpose : initializations of the horizontal ocean dynamics physics 103 102 !!---------------------------------------------------------------------- 104 INTEGER :: ioptio, ierr 103 INTEGER :: ioptio, ierr ! temporary integers 105 104 !!---------------------------------------------------------------------- 106 105 ! 107 ! ! Namelist nam_dynldf:already read in ldfdyn module106 ! !== Namelist nam_dynldf ==! already read in ldfdyn module 108 107 ! 109 IF(lwp) THEN ! Namelist print108 IF(lwp) THEN !== Namelist print ==! 110 109 WRITE(numout,*) 111 110 WRITE(numout,*) 'dyn_ldf_init : Choice of the lateral diffusive operator on dynamics' 112 111 WRITE(numout,*) '~~~~~~~~~~~~' 113 112 WRITE(numout,*) ' Namelist nam_dynldf : set lateral mixing parameters (type, direction, coefficients)' 114 WRITE(numout,*) ' laplacian operator ln_dynldf_lap = ', ln_dynldf_lap 115 WRITE(numout,*) ' bilaplacian operator ln_dynldf_blp = ', ln_dynldf_blp 116 WRITE(numout,*) ' iso-level ln_dynldf_lev = ', ln_dynldf_lev 117 WRITE(numout,*) ' horizontal (geopotential) ln_dynldf_hor = ', ln_dynldf_hor 118 WRITE(numout,*) ' iso-neutral ln_dynldf_iso = ', ln_dynldf_iso 113 WRITE(numout,*) ' Type of operator' 114 WRITE(numout,*) ' no explicit diffusion ln_dynldf_NONE = ', ln_dynldf_NONE 115 WRITE(numout,*) ' laplacian operator ln_dynldf_lap = ', ln_dynldf_lap 116 WRITE(numout,*) ' bilaplacian operator ln_dynldf_blp = ', ln_dynldf_blp 117 WRITE(numout,*) ' Direction of action' 118 WRITE(numout,*) ' iso-level ln_dynldf_lev = ', ln_dynldf_lev 119 WRITE(numout,*) ' horizontal (geopotential) ln_dynldf_hor = ', ln_dynldf_hor 120 WRITE(numout,*) ' iso-neutral ln_dynldf_iso = ', ln_dynldf_iso 119 121 ENDIF 120 ! ! use of lateral operator or not122 ! !== use of lateral operator or not ==! 121 123 nldf = np_ERROR 122 124 ioptio = 0 123 IF( ln_dynldf_ lap ) ioptio = ioptio + 1124 IF( ln_dynldf_ blp ) ioptio = ioptio + 1125 IF( ioptio > 1 ) CALL ctl_stop( 'dyn_ldf_init: use ONE or NONE of the 2 lap/bilap operator type on momentum' )126 IF( ioptio == 0 ) nldf = np_no_ldf ! No lateral mixing operator125 IF( ln_dynldf_NONE ) THEN ; nldf = np_no_ldf ; ioptio = ioptio + 1 ; ENDIF 126 IF( ln_dynldf_lap ) THEN ; ioptio = ioptio + 1 ; ENDIF 127 IF( ln_dynldf_blp ) THEN ; ioptio = ioptio + 1 ; ENDIF 128 IF( ioptio /= 1 ) CALL ctl_stop( 'dyn_ldf_init: use ONE of the 3 operator options (NONE/lap/blp)' ) 127 129 ! 128 IF( nldf /= np_no_ldf ) THEN ! direction ==>> type of operator130 IF(.NOT.ln_dynldf_NONE ) THEN !== direction ==>> type of operator ==! 129 131 ioptio = 0 130 132 IF( ln_dynldf_lev ) ioptio = ioptio + 1 131 133 IF( ln_dynldf_hor ) ioptio = ioptio + 1 132 134 IF( ln_dynldf_iso ) ioptio = ioptio + 1 133 IF( ioptio > 1 ) CALL ctl_stop( ' use only ONE direction (level/hor/iso)' ) 134 IF( ioptio == 0 ) CALL ctl_stop( ' use at least ONE direction (level/hor/iso)' ) 135 IF( ioptio /= 1 ) CALL ctl_stop( 'dyn_ldf_init: use ONE of the 3 direction options (level/hor/iso)' ) 135 136 ! 136 ! 137 ! ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals 137 138 ierr = 0 138 IF ( ln_dynldf_lap ) THEN! laplacian operator139 IF 139 IF( ln_dynldf_lap ) THEN ! laplacian operator 140 IF( ln_zco ) THEN ! z-coordinate 140 141 IF ( ln_dynldf_lev ) nldf = np_lap ! iso-level = horizontal (no rotation) 141 142 IF ( ln_dynldf_hor ) nldf = np_lap ! iso-level = horizontal (no rotation) 142 143 IF ( ln_dynldf_iso ) nldf = np_lap_i ! iso-neutral ( rotation) 143 144 ENDIF 144 IF ( ln_zps ) THEN! z-coordinate with partial step145 IF( ln_zps ) THEN ! z-coordinate with partial step 145 146 IF ( ln_dynldf_lev ) nldf = np_lap ! iso-level (no rotation) 146 147 IF ( ln_dynldf_hor ) nldf = np_lap ! iso-level (no rotation) 147 148 IF ( ln_dynldf_iso ) nldf = np_lap_i ! iso-neutral ( rotation) 148 149 ENDIF 149 IF ( ln_sco ) THEN! s-coordinate150 IF( ln_sco ) THEN ! s-coordinate 150 151 IF ( ln_dynldf_lev ) nldf = np_lap ! iso-level = horizontal (no rotation) 151 152 IF ( ln_dynldf_hor ) nldf = np_lap_i ! horizontal ( rotation) … … 154 155 ENDIF 155 156 ! 156 IF( ln_dynldf_blp ) THEN 157 IF 158 IF 159 IF 160 IF 157 IF( ln_dynldf_blp ) THEN ! bilaplacian operator 158 IF( ln_zco ) THEN ! z-coordinate 159 IF( ln_dynldf_lev ) nldf = np_blp ! iso-level = horizontal (no rotation) 160 IF( ln_dynldf_hor ) nldf = np_blp ! iso-level = horizontal (no rotation) 161 IF( ln_dynldf_iso ) ierr = 2 ! iso-neutral ( rotation) 161 162 ENDIF 162 IF ( ln_zps ) THEN! z-coordinate with partial step163 IF 164 IF 165 IF 163 IF( ln_zps ) THEN ! z-coordinate with partial step 164 IF( ln_dynldf_lev ) nldf = np_blp ! iso-level (no rotation) 165 IF( ln_dynldf_hor ) nldf = np_blp ! iso-level (no rotation) 166 IF( ln_dynldf_iso ) ierr = 2 ! iso-neutral ( rotation) 166 167 ENDIF 167 IF ( ln_sco ) THEN! s-coordinate168 IF 169 IF 170 IF 168 IF( ln_sco ) THEN ! s-coordinate 169 IF( ln_dynldf_lev ) nldf = np_blp ! iso-level (no rotation) 170 IF( ln_dynldf_hor ) ierr = 2 ! horizontal ( rotation) 171 IF( ln_dynldf_iso ) ierr = 2 ! iso-neutral ( rotation) 171 172 ENDIF 172 173 ENDIF -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_iso.F90
r8215 r8568 28 28 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 29 29 USE prtctl ! Print control 30 USE wrk_nemo ! Memory Allocation31 30 USE timing ! Timing 32 31 … … 45 44 # include "vectopt_loop_substitute.h90" 46 45 !!---------------------------------------------------------------------- 47 !! NEMO/OPA 3.3 , NEMO Consortium (2011)46 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 48 47 !! $Id$ 49 48 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 108 107 ! 109 108 INTEGER :: ji, jj, jk ! dummy loop indices 110 REAL(wp) :: zabe1, zabe2, zcof1, zcof2 ! local scalars 111 REAL(wp) :: zmskt, zmskf ! - - 112 REAL(wp) :: zcoef0, zcoef3, zcoef4, zmkt, zmkf ! - - 113 REAL(wp) :: zuav, zvav, zuwslpi, zuwslpj, zvwslpi, zvwslpj ! - - 114 ! 115 REAL(wp), POINTER, DIMENSION(:,:) :: ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v 109 REAL(wp) :: zabe1, zmskt, zmkt, zuav, zuwslpi, zuwslpj ! local scalars 110 REAL(wp) :: zabe2, zmskf, zmkf, zvav, zvwslpi, zvwslpj ! - - 111 REAL(wp) :: zcof0, zcof1, zcof2, zcof3, zcof4 ! - - 112 REAL(wp), DIMENSION(jpi,jpj) :: ziut, zivf, zdku, zdk1u ! 2D workspace 113 REAL(wp), DIMENSION(jpi,jpj) :: zjuf, zjvt, zdkv, zdk1v ! - - 116 114 !!---------------------------------------------------------------------- 117 115 ! 118 IF( nn_timing == 1 ) CALL timing_start('dyn_ldf_iso') 119 ! 120 CALL wrk_alloc( jpi, jpj, ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v ) 116 IF( ln_timing ) CALL timing_start('dyn_ldf_iso') 121 117 ! 122 118 IF( kt == nit000 ) THEN … … 343 339 DO jk = 2, jpkm1 344 340 DO ji = 2, jpim1 345 zco ef0= 0.5* rn_aht_0 * umask(ji,jj,jk)341 zcof0 = 0.5_wp * rn_aht_0 * umask(ji,jj,jk) 346 342 ! 347 zuwslpi = zco ef0 * ( wslpi(ji+1,jj,jk) + wslpi(ji,jj,jk) )348 zuwslpj = zco ef0 * ( wslpj(ji+1,jj,jk) + wslpj(ji,jj,jk) )343 zuwslpi = zcof0 * ( wslpi(ji+1,jj,jk) + wslpi(ji,jj,jk) ) 344 zuwslpj = zcof0 * ( wslpj(ji+1,jj,jk) + wslpj(ji,jj,jk) ) 349 345 ! 350 zmkt = 1./MAX( tmask(ji,jj,jk-1)+tmask(ji+1,jj,jk-1) &351 + tmask(ji,jj,jk )+tmask(ji+1,jj,jk ) , 1. )352 zmkf = 1./MAX( fmask(ji,jj-1,jk-1) + fmask(ji,jj,jk-1) &353 + fmask(ji,jj-1,jk ) + fmask(ji,jj,jk ) , 1. )354 355 zco ef3 = - e2u(ji,jj) * zmkt * zuwslpi356 zco ef4 = - e1u(ji,jj) * zmkf * zuwslpj346 zmkt = 1./MAX( tmask(ji,jj,jk-1)+tmask(ji+1,jj,jk-1) & 347 + tmask(ji,jj,jk )+tmask(ji+1,jj,jk ) , 1. ) 348 zmkf = 1./MAX( fmask(ji,jj-1,jk-1) + fmask(ji,jj,jk-1) & 349 + fmask(ji,jj-1,jk ) + fmask(ji,jj,jk ) , 1. ) 350 351 zcof3 = - e2u(ji,jj) * zmkt * zuwslpi 352 zcof4 = - e1u(ji,jj) * zmkf * zuwslpj 357 353 ! vertical flux on u field 358 zfuw(ji,jk) = zco ef3 * ( zdiu (ji,jk-1) + zdiu (ji+1,jk-1)&359 +zdiu (ji,jk ) + zdiu (ji+1,jk )) &360 + zcoef4 * ( zdj1u(ji,jk-1) + zdju (ji ,jk-1)&361 +zdj1u(ji,jk ) + zdju (ji ,jk ))354 zfuw(ji,jk) = zcof3 * ( zdiu (ji,jk-1) + zdiu (ji+1,jk-1) & 355 & + zdiu (ji,jk ) + zdiu (ji+1,jk ) ) & 356 & + zcof4 * ( zdj1u(ji,jk-1) + zdju (ji ,jk-1) & 357 & + zdj1u(ji,jk ) + zdju (ji ,jk ) ) 362 358 ! vertical mixing coefficient (akzu) 363 ! Note: zco ef0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0359 ! Note: zcof0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0 364 360 akzu(ji,jj,jk) = ( zuwslpi * zuwslpi + zuwslpj * zuwslpj ) / rn_aht_0 365 361 END DO … … 369 365 DO jk = 2, jpkm1 370 366 DO ji = 2, jpim1 371 zco ef0 = 0.5* rn_aht_0 * vmask(ji,jj,jk)372 373 zvwslpi = zco ef0 * ( wslpi(ji,jj+1,jk) + wslpi(ji,jj,jk) )374 zvwslpj = zco ef0 * ( wslpj(ji,jj+1,jk) + wslpj(ji,jj,jk) )375 376 zmkf = 1./MAX( fmask(ji-1,jj,jk-1)+fmask(ji,jj,jk-1) &377 + fmask(ji-1,jj,jk )+fmask(ji,jj,jk ), 1. )378 zmkt = 1./MAX( tmask(ji,jj,jk-1)+tmask(ji,jj+1,jk-1) &379 + tmask(ji,jj,jk )+tmask(ji,jj+1,jk ), 1. )380 381 zco ef3 = - e2v(ji,jj) * zmkf * zvwslpi382 zco ef4 = - e1v(ji,jj) * zmkt * zvwslpj367 zcof0 = 0.5_wp * rn_aht_0 * vmask(ji,jj,jk) 368 ! 369 zvwslpi = zcof0 * ( wslpi(ji,jj+1,jk) + wslpi(ji,jj,jk) ) 370 zvwslpj = zcof0 * ( wslpj(ji,jj+1,jk) + wslpj(ji,jj,jk) ) 371 ! 372 zmkf = 1./MAX( fmask(ji-1,jj,jk-1)+fmask(ji,jj,jk-1) & 373 & + fmask(ji-1,jj,jk )+fmask(ji,jj,jk ) , 1. ) 374 zmkt = 1./MAX( tmask(ji,jj,jk-1)+tmask(ji,jj+1,jk-1) & 375 & + tmask(ji,jj,jk )+tmask(ji,jj+1,jk ) , 1. ) 376 377 zcof3 = - e2v(ji,jj) * zmkf * zvwslpi 378 zcof4 = - e1v(ji,jj) * zmkt * zvwslpj 383 379 ! vertical flux on v field 384 zfvw(ji,jk) = zco ef3 * ( zdiv (ji,jk-1) + zdiv (ji-1,jk-1)&385 & +zdiv (ji,jk ) + zdiv (ji-1,jk )) &386 & + zco ef4 * ( zdjv (ji,jk-1) + zdj1v(ji ,jk-1)&387 & +zdjv (ji,jk ) + zdj1v(ji ,jk ))380 zfvw(ji,jk) = zcof3 * ( zdiv (ji,jk-1) + zdiv (ji-1,jk-1) & 381 & + zdiv (ji,jk ) + zdiv (ji-1,jk ) ) & 382 & + zcof4 * ( zdjv (ji,jk-1) + zdj1v(ji ,jk-1) & 383 & + zdjv (ji,jk ) + zdj1v(ji ,jk ) ) 388 384 ! vertical mixing coefficient (akzv) 389 ! Note: zco ef0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0385 ! Note: zcof0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0 390 386 akzv(ji,jj,jk) = ( zvwslpi * zvwslpi + zvwslpj * zvwslpj ) / rn_aht_0 391 387 END DO … … 404 400 END DO ! End of slab 405 401 ! ! =============== 406 CALL wrk_dealloc( jpi, jpj, ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v )407 402 ! 408 IF( nn_timing == 1 )CALL timing_stop('dyn_ldf_iso')403 IF( ln_timing ) CALL timing_stop('dyn_ldf_iso') 409 404 ! 410 405 END SUBROUTINE dyn_ldf_iso -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_lap_blp.F90
r7753 r8568 19 19 USE in_out_manager ! I/O manager 20 20 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 21 USE wrk_nemo ! Memory Allocation22 21 USE timing ! Timing 23 22 … … 31 30 # include "vectopt_loop_substitute.h90" 32 31 !!---------------------------------------------------------------------- 33 !! NEMO/OPA 3.7 , NEMO Consortium (2014)32 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 34 33 !! $Id$ 35 34 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 57 56 REAL(wp) :: zsign ! local scalars 58 57 REAL(wp) :: zua, zva ! local scalars 59 REAL(wp), POINTER, DIMENSION(:,:) ::zcur, zdiv58 REAL(wp), DIMENSION(jpi,jpj) :: zcur, zdiv 60 59 !!---------------------------------------------------------------------- 61 60 ! … … 66 65 ENDIF 67 66 ! 68 IF( nn_timing == 1 ) CALL timing_start('dyn_ldf_lap') 69 ! 70 CALL wrk_alloc( jpi, jpj, zcur, zdiv ) 67 IF( ln_timing ) CALL timing_start('dyn_ldf_lap') 71 68 ! 72 69 IF( kpass == 1 ) THEN ; zsign = 1._wp ! bilaplacian operator require a minus sign … … 107 104 END DO ! End of slab 108 105 ! ! =============== 109 CALL wrk_dealloc( jpi, jpj, zcur, zdiv )110 106 ! 111 IF( nn_timing == 1 )CALL timing_stop('dyn_ldf_lap')107 IF( ln_timing ) CALL timing_stop('dyn_ldf_lap') 112 108 ! 113 109 END SUBROUTINE dyn_ldf_lap … … 131 127 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! momentum trend 132 128 ! 133 REAL(wp), POINTER, DIMENSION(:,:,:) :: zulap, zvlap ! laplacian at u- and v-point129 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zulap, zvlap ! laplacian at u- and v-point 134 130 !!---------------------------------------------------------------------- 135 131 ! 136 IF( nn_timing == 1 ) CALL timing_start('dyn_ldf_blp') 137 ! 138 CALL wrk_alloc( jpi, jpj, jpk, zulap, zvlap ) 132 IF( ln_timing ) CALL timing_start('dyn_ldf_blp') 139 133 ! 140 134 IF( kt == nit000 ) THEN … … 154 148 CALL dyn_ldf_lap( kt, zulap, zvlap, pua, pva, 2 ) ! rotated laplacian applied to zlap (output in pta) 155 149 ! 156 CALL wrk_dealloc( jpi, jpj, jpk, zulap, zvlap ) 157 ! 158 IF( nn_timing == 1 ) CALL timing_stop('dyn_ldf_blp') 150 IF( ln_timing ) CALL timing_stop('dyn_ldf_blp') 159 151 ! 160 152 END SUBROUTINE dyn_ldf_blp -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynnxt.F90
r7753 r8568 44 44 USE lbclnk ! lateral boundary condition (or mpp link) 45 45 USE lib_mpp ! MPP library 46 USE wrk_nemo ! Memory Allocation47 46 USE prtctl ! Print control 48 47 USE timing ! Timing … … 57 56 58 57 !!---------------------------------------------------------------------- 59 !! NEMO/OPA 3.3 , NEMO Consortium (2010)58 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 60 59 !! $Id$ 61 60 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 97 96 REAL(wp) :: zue3a, zue3n, zue3b, zuf, zcoef ! local scalars 98 97 REAL(wp) :: zve3a, zve3n, zve3b, zvf, z1_2dt ! - - 99 REAL(wp), POINTER, DIMENSION(:,:) ::zue, zve100 REAL(wp), POINTER, DIMENSION(:,:,:) ::ze3u_f, ze3v_f, zua, zva98 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zue, zve 99 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ze3u_f, ze3v_f, zua, zva 101 100 !!---------------------------------------------------------------------- 102 101 ! 103 IF( nn_timing == 1 ) CALL timing_start('dyn_nxt') 104 ! 105 IF( ln_dynspg_ts ) CALL wrk_alloc( jpi,jpj, zue, zve) 106 IF( l_trddyn ) CALL wrk_alloc( jpi,jpj,jpk, zua, zva) 102 IF( ln_timing ) CALL timing_start('dyn_nxt') 103 IF( ln_dynspg_ts ) ALLOCATE( zue(jpi,jpj) , zve(jpi,jpj) ) 104 IF( l_trddyn ) ALLOCATE( zua(jpi,jpj,jpk) , zva(jpi,jpj,jpk) ) 107 105 ! 108 106 IF( kt == nit000 ) THEN … … 253 251 ELSE ! Asselin filter applied on thickness weighted velocity 254 252 ! 255 CALL wrk_alloc( jpi,jpj,jpk, ze3u_f, ze3v_f)253 ALLOCATE( ze3u_f(jpi,jpj,jpk) , ze3v_f(jpi,jpj,jpk) ) 256 254 ! Before filtered scale factor at (u/v)-points stored in ze3u_f, ze3v_f 257 255 CALL dom_vvl_interpol( e3t_b(:,:,:), ze3u_f, 'U' ) … … 280 278 e3v_b(:,:,1:jpkm1) = ze3v_f(:,:,1:jpkm1) 281 279 ! 282 CALL wrk_dealloc( jpi,jpj,jpk, ze3u_f, ze3v_f )280 DEALLOCATE( ze3u_f , ze3v_f ) 283 281 ENDIF 284 282 ! … … 346 344 & tab3d_2=vn, clinfo2=' Vn: ' , mask2=vmask ) 347 345 ! 348 IF( ln_dynspg_ts ) CALL wrk_dealloc( jpi,jpj, zue, zve ) 349 IF( l_trddyn ) CALL wrk_dealloc( jpi,jpj,jpk, zua, zva ) 350 ! 351 IF( nn_timing == 1 ) CALL timing_stop('dyn_nxt') 346 IF( ln_dynspg_ts ) DEALLOCATE( zue, zve ) 347 IF( l_trddyn ) DEALLOCATE( zua, zva ) 348 IF( ln_timing ) CALL timing_stop('dyn_nxt') 352 349 ! 353 350 END SUBROUTINE dyn_nxt -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg.F90
r7753 r8568 28 28 USE in_out_manager ! I/O manager 29 29 USE lib_mpp ! MPP library 30 USE wrk_nemo ! Memory Allocation31 30 USE timing ! Timing 32 31 … … 47 46 # include "vectopt_loop_substitute.h90" 48 47 !!---------------------------------------------------------------------- 49 !! NEMO/OPA 3.2 , LODYC-IPSL (2009)48 !! NEMO/OPA 4.0 , LODYC-IPSL (2017) 50 49 !! $Id$ 51 50 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 71 70 !! period is used to prevent the divergence of odd and even time step. 72 71 !!---------------------------------------------------------------------- 73 INTEGER, INTENT(in ) :: kt 74 ! 75 INTEGER :: ji, jj, jk 76 REAL(wp) :: z2dt, zg_2, zintp, zgrau0r ! temporary scalar77 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv78 REAL(wp), POINTER, DIMENSION(:,:) :: zpice79 !!---------------------------------------------------------------------- 80 ! 81 IF( nn_timing == 1 )CALL timing_start('dyn_spg')72 INTEGER, INTENT(in ) :: kt ! ocean time-step index 73 ! 74 INTEGER :: ji, jj, jk ! dummy loop indices 75 REAL(wp) :: z2dt, zg_2, zintp, zgrau0r ! local scalars 76 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zpice 77 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv 78 !!---------------------------------------------------------------------- 79 ! 80 IF( ln_timing ) CALL timing_start('dyn_spg') 82 81 ! 83 82 IF( l_trddyn ) THEN ! temporary save of ta and sa trends 84 CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv)83 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 85 84 ztrdu(:,:,:) = ua(:,:,:) 86 85 ztrdv(:,:,:) = va(:,:,:) … … 124 123 ! 125 124 IF( nn_ice_embd == 2 ) THEN !== embedded sea ice: Pressure gradient due to snow-ice mass ==! 126 CALL wrk_alloc( jpi,jpj, zpice ) 127 ! 125 ALLOCATE( zpice(jpi,jpj) ) 128 126 zintp = REAL( MOD( kt-1, nn_fsbc ) ) / REAL( nn_fsbc ) 129 127 zgrau0r = - grav * r1_rau0 … … 135 133 END DO 136 134 END DO 137 ! 138 CALL wrk_dealloc( jpi,jpj, zpice ) 135 DEALLOCATE( zpice ) 139 136 ENDIF 140 137 ! … … 161 158 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 162 159 CALL trd_dyn( ztrdu, ztrdv, jpdyn_spg, kt ) 163 CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv )160 DEALLOCATE( ztrdu , ztrdv ) 164 161 ENDIF 165 162 ! ! print mean trends (used for debugging) … … 167 164 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 168 165 ! 169 IF( nn_timing == 1 )CALL timing_stop('dyn_spg')166 IF( ln_timing ) CALL timing_stop('dyn_spg') 170 167 ! 171 168 END SUBROUTINE dyn_spg … … 186 183 !!---------------------------------------------------------------------- 187 184 ! 188 IF( nn_timing == 1 )CALL timing_start('dyn_spg_init')185 IF( ln_timing ) CALL timing_start('dyn_spg_init') 189 186 ! 190 187 REWIND( numnam_ref ) ! Namelist namdyn_spg in reference namelist : Free surface … … 227 224 ENDIF 228 225 ! 229 IF( nn_timing == 1 )CALL timing_stop('dyn_spg_init')226 IF( ln_timing ) CALL timing_stop('dyn_spg_init') 230 227 ! 231 228 END SUBROUTINE dyn_spg_init -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_exp.F90
r6140 r8568 61 61 !!---------------------------------------------------------------------- 62 62 ! 63 IF( nn_timing == 1 )CALL timing_start('dyn_spg_exp')63 IF( ln_timing ) CALL timing_start('dyn_spg_exp') 64 64 ! 65 65 IF( kt == nit000 ) THEN … … 93 93 ENDIF 94 94 ! 95 IF( nn_timing == 1 )CALL timing_stop('dyn_spg_exp')95 IF( ln_timing ) CALL timing_stop('dyn_spg_exp') 96 96 ! 97 97 END SUBROUTINE dyn_spg_exp -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90
r8215 r8568 162 162 !!---------------------------------------------------------------------- 163 163 ! 164 IF( nn_timing == 1) CALL timing_start('dyn_spg_ts')164 IF( ln_timing ) CALL timing_start('dyn_spg_ts') 165 165 ! 166 166 IF( ln_wd ) ALLOCATE( zcpx(jpi,jpj), zcpy(jpi,jpj) ) … … 1125 1125 IF( ln_wd ) DEALLOCATE( zcpx, zcpy ) 1126 1126 ! 1127 IF 1127 IF( ln_diatmb ) THEN 1128 1128 CALL iom_put( "baro_u" , un_b*umask(:,:,1)+zmdi*(1-umask(:,:,1 ) ) ) ! Barotropic U Velocity 1129 1129 CALL iom_put( "baro_v" , vn_b*vmask(:,:,1)+zmdi*(1-vmask(:,:,1 ) ) ) ! Barotropic V Velocity 1130 1130 ENDIF 1131 IF( nn_timing == 1 )CALL timing_stop('dyn_spg_ts')1131 IF( ln_timing ) CALL timing_stop('dyn_spg_ts') 1132 1132 ! 1133 1133 END SUBROUTINE dyn_spg_ts -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynvor.F90
r7753 r8568 14 14 !! 2.0 ! 2006-11 (G. Madec) flux form advection: add metric term 15 15 !! 3.2 ! 2009-04 (R. Benshila) vvl: correction of een scheme 16 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase17 !! 3.7 ! 2014-04 (G. Madec) trend simplification: suppress jpdyn_trd_dat vorticity18 !! - ! 2014-06 (G. Madec) suppression of velocity curl from in-core memory16 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 17 !! 3.7 ! 2014-04 (G. Madec) trend simplification: suppress jpdyn_trd_dat vorticity 18 !! - ! 2014-06 (G. Madec) suppression of velocity curl from in-core memory 19 19 !! - ! 2016-12 (G. Madec, E. Clementi) add Stokes-Coriolis trends (ln_stcor=T) 20 !! 4.0 ! 2017-07 (G. Madec) linear dynamics + trends diag. with Stokes-Coriolis 20 21 !!---------------------------------------------------------------------- 21 22 22 23 !!---------------------------------------------------------------------- 23 !! dyn_vor : Update the momentum trend with the vorticity trend24 !! vor_ens : enstrophy conserving scheme (ln_dynvor_ens=T)25 !! vor_ene : energy conserving scheme (ln_dynvor_ene=T)26 !! vor_een : energy and enstrophy conserving (ln_dynvor_een=T)27 !! dyn_vor_init : set and control of the different vorticity option24 !! dyn_vor : Update the momentum trend with the vorticity trend 25 !! vor_ens : enstrophy conserving scheme (ln_dynvor_ens=T) 26 !! vor_ene : energy conserving scheme (ln_dynvor_ene=T) 27 !! vor_een : energy and enstrophy conserving (ln_dynvor_een=T) 28 !! dyn_vor_init : set and control of the different vorticity option 28 29 !!---------------------------------------------------------------------- 29 30 USE oce ! ocean dynamics and tracers 30 31 USE dom_oce ! ocean space and time domain 31 32 USE dommsk ! ocean mask 32 USE dynadv ! momentum advection (use ln_dynadv_vec value)33 USE dynadv ! momentum advection 33 34 USE trd_oce ! trends: ocean variables 34 35 USE trddyn ! trend manager: dynamics … … 40 41 USE in_out_manager ! I/O manager 41 42 USE lib_mpp ! MPP library 42 USE wrk_nemo ! Memory Allocation43 43 USE timing ! Timing 44 45 44 46 45 IMPLICIT NONE … … 80 79 # include "vectopt_loop_substitute.h90" 81 80 !!---------------------------------------------------------------------- 82 !! NEMO/OPA 3.7 , NEMO Consortium (2016)81 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 83 82 !! $Id$ 84 83 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 98 97 INTEGER, INTENT( in ) :: kt ! ocean time-step index 99 98 ! 100 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 101 !!---------------------------------------------------------------------- 102 ! 103 IF( nn_timing == 1 ) CALL timing_start('dyn_vor') 104 ! 105 IF( l_trddyn ) CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 106 ! 107 SELECT CASE ( nvor_scheme ) !== vorticity trend added to the general trend ==! 108 ! 109 CASE ( np_ENE ) !* energy conserving scheme 110 IF( l_trddyn ) THEN ! trend diagnostics: split the trend in two 99 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv 100 !!---------------------------------------------------------------------- 101 ! 102 IF( ln_timing ) CALL timing_start('dyn_vor') 103 ! 104 IF( l_trddyn ) THEN !== trend diagnostics case : split the added trend in two parts ==! 105 ! 106 ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) ) 107 ! 108 ztrdu(:,:,:) = ua(:,:,:) !* planetary vorticity trend (including Stokes-Coriolis force) 109 ztrdv(:,:,:) = va(:,:,:) 110 SELECT CASE( nvor_scheme ) 111 CASE( np_ENE, np_MIX ) ; CALL vor_ene( kt, ncor, un , vn , ua, va ) ! energy conserving scheme 112 IF( ln_stcor ) CALL vor_ene( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 113 CASE( np_ENS ) ; CALL vor_ens( kt, ncor, un , vn , ua, va ) ! enstrophy conserving scheme 114 IF( ln_stcor ) CALL vor_ens( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 115 CASE( np_EEN ) ; CALL vor_een( kt, ncor, un , vn , ua, va ) ! energy & enstrophy scheme 116 IF( ln_stcor ) CALL vor_een( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 117 END SELECT 118 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 119 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 120 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 121 ! 122 IF( n_dynadv /= np_LIN_dyn ) THEN !* relative vorticity or metric trend (only in non-linear case) 111 123 ztrdu(:,:,:) = ua(:,:,:) 112 124 ztrdv(:,:,:) = va(:,:,:) 113 CALL vor_ene( kt, nrvm, un , vn , ua, va ) ! relative vorticity or metric trend 125 SELECT CASE( nvor_scheme ) 126 CASE( np_ENE ) ; CALL vor_ene( kt, nrvm, un , vn , ua, va ) ! energy conserving scheme 127 CASE( np_ENS, np_MIX ) ; CALL vor_ens( kt, nrvm, un , vn , ua, va ) ! enstrophy conserving scheme 128 CASE( np_EEN ) ; CALL vor_een( kt, nrvm, un , vn , ua, va ) ! energy & enstrophy scheme 129 END SELECT 114 130 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 115 131 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 116 132 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 117 ztrdu(:,:,:) = ua(:,:,:) 118 ztrdv(:,:,:) = va(:,:,:) 119 CALL vor_ene( kt, ncor, un , vn , ua, va ) ! planetary vorticity trend 120 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 121 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 122 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 123 ELSE ! total vorticity trend 133 ENDIF 134 ! 135 DEALLOCATE( ztrdu, ztrdv ) 136 ! 137 ELSE !== total vorticity trend added to the general trend ==! 138 ! 139 SELECT CASE ( nvor_scheme ) !== vorticity trend added to the general trend ==! 140 CASE( np_ENE ) !* energy conserving scheme 124 141 CALL vor_ene( kt, ntot, un , vn , ua, va ) ! total vorticity trend 125 142 IF( ln_stcor ) CALL vor_ene( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 126 ENDIF 127 ! 128 CASE ( np_ENS ) !* enstrophy conserving scheme 129 IF( l_trddyn ) THEN ! trend diagnostics: splitthe trend in two 130 ztrdu(:,:,:) = ua(:,:,:) 131 ztrdv(:,:,:) = va(:,:,:) 132 CALL vor_ens( kt, nrvm, un , vn , ua, va ) ! relative vorticity or metric trend 133 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 134 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 135 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 136 ztrdu(:,:,:) = ua(:,:,:) 137 ztrdv(:,:,:) = va(:,:,:) 138 CALL vor_ens( kt, ncor, un , vn , ua, va ) ! planetary vorticity trend 139 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 140 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 141 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 142 ELSE ! total vorticity trend 143 CASE( np_ENS ) !* enstrophy conserving scheme 143 144 CALL vor_ens( kt, ntot, un , vn , ua, va ) ! total vorticity trend 144 145 IF( ln_stcor ) CALL vor_ens( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 145 ENDIF 146 ! 147 CASE ( np_MIX ) !* mixed ene-ens scheme 148 IF( l_trddyn ) THEN ! trend diagnostics: split the trend in two 149 ztrdu(:,:,:) = ua(:,:,:) 150 ztrdv(:,:,:) = va(:,:,:) 151 CALL vor_ens( kt, nrvm, un , vn , ua, va ) ! relative vorticity or metric trend (ens) 152 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 153 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 154 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 155 ztrdu(:,:,:) = ua(:,:,:) 156 ztrdv(:,:,:) = va(:,:,:) 157 CALL vor_ene( kt, ncor, un , vn , ua, va ) ! planetary vorticity trend (ene) 158 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 159 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 160 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 161 ELSE ! total vorticity trend 146 CASE( np_MIX ) !* mixed ene-ens scheme 162 147 CALL vor_ens( kt, nrvm, un , vn , ua, va ) ! relative vorticity or metric trend (ens) 163 148 CALL vor_ene( kt, ncor, un , vn , ua, va ) ! planetary vorticity trend (ene) 164 149 IF( ln_stcor ) CALL vor_ene( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 165 ENDIF 166 ! 167 CASE ( np_EEN ) !* energy and enstrophy conserving scheme 168 IF( l_trddyn ) THEN ! trend diagnostics: split the trend in two 169 ztrdu(:,:,:) = ua(:,:,:) 170 ztrdv(:,:,:) = va(:,:,:) 171 CALL vor_een( kt, nrvm, un , vn , ua, va ) ! relative vorticity or metric trend 172 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 173 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 174 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 175 ztrdu(:,:,:) = ua(:,:,:) 176 ztrdv(:,:,:) = va(:,:,:) 177 CALL vor_een( kt, ncor, un , vn , ua, va ) ! planetary vorticity trend 178 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 179 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 180 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 181 ELSE ! total vorticity trend 150 CASE( np_EEN ) !* energy and enstrophy conserving scheme 182 151 CALL vor_een( kt, ntot, un , vn , ua, va ) ! total vorticity trend 183 152 IF( ln_stcor ) CALL vor_ene( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 184 END IF185 ! 186 END SELECT153 END SELECT 154 ! 155 ENDIF 187 156 ! 188 157 ! ! print sum trends (used for debugging) … … 190 159 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 191 160 ! 192 IF( l_trddyn ) CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 193 ! 194 IF( nn_timing == 1 ) CALL timing_stop('dyn_vor') 161 IF( ln_timing ) CALL timing_stop('dyn_vor') 195 162 ! 196 163 END SUBROUTINE dyn_vor … … 217 184 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 218 185 !!---------------------------------------------------------------------- 219 INTEGER , INTENT(in ) :: kt ! ocean time-step index 220 INTEGER , INTENT(in ) :: kvor ! =ncor (planetary) ; =ntot (total) ; 221 ! ! =nrvm (relative vorticity or metric) 222 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pun, pvn ! now velocities 223 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pua, pva ! total v-trend 186 INTEGER , INTENT(in ):: kt ! ocean time-step index 187 INTEGER , INTENT(in ):: kvor ! total, planetary, relative, or metric 188 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pun, pvn ! now velocities 189 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! total v-trend 224 190 ! 225 191 INTEGER :: ji, jj, jk ! dummy loop indices 226 192 REAL(wp) :: zx1, zy1, zx2, zy2 ! local scalars 227 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz ! 2D workspace 228 !!---------------------------------------------------------------------- 229 ! 230 IF( nn_timing == 1 ) CALL timing_start('vor_ene') 231 ! 232 CALL wrk_alloc( jpi,jpj, zwx, zwy, zwz ) 193 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz ! 2D workspace 194 !!---------------------------------------------------------------------- 195 ! 196 IF( ln_timing ) CALL timing_start('vor_ene') 233 197 ! 234 198 IF( kt == nit000 ) THEN … … 264 228 DO ji = 1, fs_jpim1 ! vector opt. 265 229 zwz(ji,jj) = ff_f(ji,jj) + ( e2v(ji+1,jj ) * pvn(ji+1,jj ,jk) - e2v(ji,jj) * pvn(ji,jj,jk) & 266 & - e1u(ji ,jj+1) * pun(ji ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk) ) &230 & - e1u(ji ,jj+1) * pun(ji ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk) ) & 267 231 & * r1_e1e2f(ji,jj) 268 232 END DO … … 311 275 END DO ! End of slab 312 276 ! ! =============== 313 CALL wrk_dealloc( jpi, jpj, zwx, zwy, zwz ) 314 ! 315 IF( nn_timing == 1 ) CALL timing_stop('vor_ene') 277 ! 278 IF( ln_timing ) CALL timing_stop('vor_ene') 316 279 ! 317 280 END SUBROUTINE vor_ene … … 338 301 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 339 302 !!---------------------------------------------------------------------- 340 INTEGER , INTENT(in ) :: kt ! ocean time-step index 341 INTEGER , INTENT(in ) :: kvor ! =ncor (planetary) ; =ntot (total) ; 342 ! ! =nrvm (relative vorticity or metric) 343 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pun, pvn ! now velocities 344 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pua, pva ! total v-trend 303 INTEGER , INTENT(in ):: kt ! ocean time-step index 304 INTEGER , INTENT(in ):: kvor ! total, planetary, relative, or metric 305 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pun, pvn ! now velocities 306 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! total v-trend 345 307 ! 346 308 INTEGER :: ji, jj, jk ! dummy loop indices 347 309 REAL(wp) :: zuav, zvau ! local scalars 348 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, zww ! 2D workspace 349 !!---------------------------------------------------------------------- 350 ! 351 IF( nn_timing == 1 ) CALL timing_start('vor_ens') 352 ! 353 CALL wrk_alloc( jpi,jpj, zwx, zwy, zwz ) 310 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz, zww ! 2D workspace 311 !!---------------------------------------------------------------------- 312 ! 313 IF( ln_timing ) CALL timing_start('vor_ens') 354 314 ! 355 315 IF( kt == nit000 ) THEN … … 431 391 END DO ! End of slab 432 392 ! ! =============== 433 CALL wrk_dealloc( jpi, jpj, zwx, zwy, zwz ) 434 ! 435 IF( nn_timing == 1 ) CALL timing_stop('vor_ens') 393 ! 394 IF( ln_timing ) CALL timing_stop('vor_ens') 436 395 ! 437 396 END SUBROUTINE vor_ens … … 455 414 !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 456 415 !!---------------------------------------------------------------------- 457 INTEGER , INTENT(in ) :: kt ! ocean time-step index 458 INTEGER , INTENT(in ) :: kvor ! =ncor (planetary) ; =ntot (total) ; 459 ! ! =nrvm (relative vorticity or metric) 460 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pun, pvn ! now velocities 461 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pua, pva ! total v-trend 416 INTEGER , INTENT(in ):: kt ! ocean time-step index 417 INTEGER , INTENT(in ):: kvor ! total, planetary, relative, or metric 418 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pun, pvn ! now velocities 419 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! total v-trend 462 420 ! 463 421 INTEGER :: ji, jj, jk ! dummy loop indices … … 465 423 REAL(wp) :: zua, zva ! local scalars 466 424 REAL(wp) :: zmsk, ze3 ! local scalars 467 ! 468 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, z1_e3f 469 REAL(wp), POINTER, DIMENSION(:,:) :: ztnw, ztne, ztsw, ztse 470 !!---------------------------------------------------------------------- 471 ! 472 IF( nn_timing == 1 ) CALL timing_start('vor_een') 473 ! 474 CALL wrk_alloc( jpi,jpj, zwx , zwy , zwz , z1_e3f ) 475 CALL wrk_alloc( jpi,jpj, ztnw, ztne, ztsw, ztse ) 425 REAL(wp), DIMENSION(jpi,jpj) :: zwx , zwy , zwz , z1_e3f 426 REAL(wp), DIMENSION(jpi,jpj) :: ztnw, ztne, ztsw, ztse 427 !!---------------------------------------------------------------------- 428 ! 429 IF( ln_timing ) CALL timing_start('vor_een') 476 430 ! 477 431 IF( kt == nit000 ) THEN … … 599 553 ! ! =============== 600 554 ! 601 CALL wrk_dealloc( jpi,jpj, zwx , zwy , zwz , z1_e3f ) 602 CALL wrk_dealloc( jpi,jpj, ztnw, ztne, ztsw, ztse ) 603 ! 604 IF( nn_timing == 1 ) CALL timing_stop('vor_een') 555 IF( ln_timing ) CALL timing_stop('vor_een') 605 556 ! 606 557 END SUBROUTINE vor_een … … 618 569 INTEGER :: ios ! Local integer output status for namelist read 619 570 !! 620 NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een, nn_een_e3f, ln_dynvor_msk 571 NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, & 572 & ln_dynvor_een, nn_een_e3f , ln_dynvor_msk 621 573 !!---------------------------------------------------------------------- 622 574 … … 672 624 ! 673 625 IF(lwp) WRITE(numout,*) ! type of calculated vorticity (set ncor, nrvm, ntot) 674 ncor = np_COR 675 IF( ln_dynadv_vec ) THEN 676 IF(lwp) WRITE(numout,*) ' ===>> Vector form advection : vorticity = Coriolis + relative vorticity' 626 ncor = np_COR ! planetary vorticity 627 SELECT CASE( n_dynadv ) 628 CASE( np_LIN_dyn ) 629 IF(lwp) WRITE(numout,*) ' ===>> linear dynamics : total vorticity = Coriolis' 630 nrvm = np_COR ! planetary vorticity 631 ntot = np_COR ! - - 632 CASE( np_VEC_c2 ) 633 IF(lwp) WRITE(numout,*) ' ===>> vector form dynamics : total vorticity = Coriolis + relative vorticity' 677 634 nrvm = np_RVO ! relative vorticity 678 ntot = np_CRV ! relative + planetary vorticity 679 ELSE680 IF(lwp) WRITE(numout,*) ' ===>> Flux form advection :vorticity = Coriolis + metric term'635 ntot = np_CRV ! relative + planetary vorticity 636 CASE( np_FLX_c2 , np_FLX_ubs ) 637 IF(lwp) WRITE(numout,*) ' ===>> flux form dynamics : total vorticity = Coriolis + metric term' 681 638 nrvm = np_MET ! metric term 682 639 ntot = np_CME ! Coriolis + metric term 683 END IF640 END SELECT 684 641 685 642 IF(lwp) THEN ! Print the choice 686 643 WRITE(numout,*) 687 IF( nvor_scheme == np_ENE ) WRITE(numout,*) ' ===>> energy conserving scheme' 688 IF( nvor_scheme == np_ENS ) WRITE(numout,*) ' ===>> enstrophy conserving scheme' 689 IF( nvor_scheme == np_MIX ) WRITE(numout,*) ' ===>> mixed enstrophy/energy conserving scheme' 690 IF( nvor_scheme == np_EEN ) WRITE(numout,*) ' ===>> energy and enstrophy conserving scheme' 644 SELECT CASE( nvor_scheme ) 645 CASE( np_ENE ) ; WRITE(numout,*) ' ===>> energy conserving scheme' 646 CASE( np_ENS ) ; WRITE(numout,*) ' ===>> enstrophy conserving scheme' 647 CASE( np_MIX ) ; WRITE(numout,*) ' ===>> mixed enstrophy/energy conserving scheme' 648 CASE( np_EEN ) ; WRITE(numout,*) ' ===>> energy and enstrophy conserving scheme' 649 END SELECT 691 650 ENDIF 692 651 ! -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynzad.F90
r7753 r8568 5 5 !!====================================================================== 6 6 !! History : OPA ! 1991-01 (G. Madec) Original code 7 !! 7.0 ! 1991-11 (G. Madec)8 !! 7.5 ! 1996-01 (G. Madec) statement function for e39 7 !! NEMO 0.5 ! 2002-07 (G. Madec) Free form, F90 10 8 !!---------------------------------------------------------------------- … … 22 20 USE lib_mpp ! MPP library 23 21 USE prtctl ! Print control 24 USE wrk_nemo ! Memory Allocation25 22 USE timing ! Timing 26 23 … … 29 26 30 27 PUBLIC dyn_zad ! routine called by dynadv.F90 31 PUBLIC dyn_zad_zts ! routine called by dynadv.F9032 28 33 29 !! * Substitutions 34 30 # include "vectopt_loop_substitute.h90" 35 31 !!---------------------------------------------------------------------- 36 !! NEMO/OPA 3.3 , NEMO Consortium (2010)32 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 37 33 !! $Id$ 38 34 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 58 54 INTEGER, INTENT(in) :: kt ! ocean time-step inedx 59 55 ! 60 INTEGER :: ji, jj, jk 61 REAL(wp) :: zua, zva ! temporaryscalars62 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwuw , zwvw63 REAL(wp), POINTER, DIMENSION(:,: ) :: zww64 REAL(wp), POINTER, DIMENSION(:,:,:) ::ztrdu, ztrdv56 INTEGER :: ji, jj, jk ! dummy loop indices 57 REAL(wp) :: zua, zva ! local scalars 58 REAL(wp), DIMENSION(jpi,jpj) :: zww 59 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwuw, zwvw 60 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdu, ztrdv 65 61 !!---------------------------------------------------------------------- 66 62 ! 67 IF( nn_timing == 1 ) CALL timing_start('dyn_zad') 68 ! 69 CALL wrk_alloc( jpi,jpj, zww ) 70 CALL wrk_alloc( jpi,jpj,jpk, zwuw , zwvw ) 63 IF( ln_timing ) CALL timing_start('dyn_zad') 71 64 ! 72 65 IF( kt == nit000 ) THEN 73 IF(lwp) WRITE(numout,*)74 IF(lwp) WRITE(numout,*) 'dyn_zad : arakawaadvection scheme'66 IF(lwp) WRITE(numout,*) 67 IF(lwp) WRITE(numout,*) 'dyn_zad : 2nd order vertical advection scheme' 75 68 ENDIF 76 69 77 70 IF( l_trddyn ) THEN ! Save ua and va trends 78 CALL wrk_alloc( jpi, jpj, jpk, ztrdu, ztrdv)71 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 79 72 ztrdu(:,:,:) = ua(:,:,:) 80 73 ztrdv(:,:,:) = va(:,:,:) … … 96 89 ! 97 90 ! Surface and bottom advective fluxes set to zero 98 IF 91 IF( ln_isfcav ) THEN 99 92 DO jj = 2, jpjm1 100 93 DO ji = fs_2, fs_jpim1 ! vector opt. … … 119 112 DO jj = 2, jpjm1 120 113 DO ji = fs_2, fs_jpim1 ! vector opt. 121 ! ! vertical momentum advective trends 122 zua = - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 123 zva = - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 124 ! ! add the trends to the general momentum trends 125 ua(ji,jj,jk) = ua(ji,jj,jk) + zua 126 va(ji,jj,jk) = va(ji,jj,jk) + zva 114 ua(ji,jj,jk) = ua(ji,jj,jk) - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 115 va(ji,jj,jk) = va(ji,jj,jk) - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 127 116 END DO 128 117 END DO … … 133 122 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 134 123 CALL trd_dyn( ztrdu, ztrdv, jpdyn_zad, kt ) 135 CALL wrk_dealloc( jpi, jpj, jpk,ztrdu, ztrdv )124 DEALLOCATE( ztrdu, ztrdv ) 136 125 ENDIF 137 126 ! ! Control print … … 139 128 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 140 129 ! 141 CALL wrk_dealloc( jpi,jpj, zww ) 142 CALL wrk_dealloc( jpi,jpj,jpk, zwuw , zwvw ) 143 ! 144 IF( nn_timing == 1 ) CALL timing_stop('dyn_zad') 130 IF( ln_timing ) CALL timing_stop('dyn_zad') 145 131 ! 146 132 END SUBROUTINE dyn_zad 147 133 148 149 SUBROUTINE dyn_zad_zts ( kt )150 !!----------------------------------------------------------------------151 !! *** ROUTINE dynzad_zts ***152 !!153 !! ** Purpose : Compute the now vertical momentum advection trend and154 !! add it to the general trend of momentum equation. This version155 !! uses sub-timesteps for improved numerical stability with small156 !! vertical grid sizes. This is especially relevant when using157 !! embedded ice with thin surface boxes.158 !!159 !! ** Method : The now vertical advection of momentum is given by:160 !! w dz(u) = ua + 1/(e1u*e2u*e3u) mk+1[ mi(e1t*e2t*wn) dk(un) ]161 !! w dz(v) = va + 1/(e1v*e2v*e3v) mk+1[ mj(e1t*e2t*wn) dk(vn) ]162 !! Add this trend to the general trend (ua,va):163 !! (ua,va) = (ua,va) + w dz(u,v)164 !!165 !! ** Action : - Update (ua,va) with the vert. momentum adv. trends166 !! - Save the trends in (ztrdu,ztrdv) ('key_trddyn')167 !!----------------------------------------------------------------------168 INTEGER, INTENT(in) :: kt ! ocean time-step inedx169 !170 INTEGER :: ji, jj, jk, jl ! dummy loop indices171 INTEGER :: jnzts = 5 ! number of sub-timesteps for vertical advection172 INTEGER :: jtb, jtn, jta ! sub timestep pointers for leap-frog/euler forward steps173 REAL(wp) :: zua, zva ! temporary scalars174 REAL(wp) :: zr_rdt ! temporary scalar175 REAL(wp) :: z2dtzts ! length of Euler forward sub-timestep for vertical advection176 REAL(wp) :: zts ! length of sub-timestep for vertical advection177 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwuw , zwvw, zww178 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv179 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: zus , zvs180 !!----------------------------------------------------------------------181 !182 IF( nn_timing == 1 ) CALL timing_start('dyn_zad_zts')183 !184 CALL wrk_alloc( jpi,jpj,jpk, zwuw, zwvw, zww )185 CALL wrk_alloc( jpi,jpj,jpk,3, zus , zvs )186 !187 IF( kt == nit000 ) THEN188 IF(lwp)WRITE(numout,*)189 IF(lwp)WRITE(numout,*) 'dyn_zad_zts : arakawa advection scheme with sub-timesteps'190 ENDIF191 192 IF( l_trddyn ) THEN ! Save ua and va trends193 CALL wrk_alloc( jpi, jpj, jpk, ztrdu, ztrdv )194 ztrdu(:,:,:) = ua(:,:,:)195 ztrdv(:,:,:) = va(:,:,:)196 ENDIF197 198 IF( neuler == 0 .AND. kt == nit000 ) THEN199 z2dtzts = rdt / REAL( jnzts, wp ) ! = rdt (restart with Euler time stepping)200 ELSE201 z2dtzts = 2._wp * rdt / REAL( jnzts, wp ) ! = 2 rdt (leapfrog)202 ENDIF203 204 DO jk = 2, jpkm1 ! Calculate and store vertical fluxes205 DO jj = 2, jpj206 DO ji = fs_2, jpi ! vector opt.207 zww(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk)208 END DO209 END DO210 END DO211 212 DO jj = 2, jpjm1 ! Surface and bottom advective fluxes set to zero213 DO ji = fs_2, fs_jpim1 ! vector opt.214 !!gm missing ISF boundary condition215 zwuw(ji,jj, 1 ) = 0._wp216 zwvw(ji,jj, 1 ) = 0._wp217 zwuw(ji,jj,jpk) = 0._wp218 zwvw(ji,jj,jpk) = 0._wp219 END DO220 END DO221 222 ! Start with before values and use sub timestepping to reach after values223 224 zus(:,:,:,1) = ub(:,:,:)225 zvs(:,:,:,1) = vb(:,:,:)226 227 DO jl = 1, jnzts ! Start of sub timestepping loop228 229 IF( jl == 1 ) THEN ! Euler forward to kick things off230 jtb = 1 ; jtn = 1 ; jta = 2231 zts = z2dtzts232 ELSEIF( jl == 2 ) THEN ! First leapfrog step233 jtb = 1 ; jtn = 2 ; jta = 3234 zts = 2._wp * z2dtzts235 ELSE ! Shuffle pointers for subsequent leapfrog steps236 jtb = MOD(jtb,3) + 1237 jtn = MOD(jtn,3) + 1238 jta = MOD(jta,3) + 1239 ENDIF240 241 DO jk = 2, jpkm1 ! Vertical momentum advection at level w and u- and v- vertical242 DO jj = 2, jpjm1 ! vertical momentum advection at w-point243 DO ji = fs_2, fs_jpim1 ! vector opt.244 zwuw(ji,jj,jk) = ( zww(ji+1,jj ,jk) + zww(ji,jj,jk) ) * ( zus(ji,jj,jk-1,jtn)-zus(ji,jj,jk,jtn) ) !* wumask(ji,jj,jk)245 zwvw(ji,jj,jk) = ( zww(ji ,jj+1,jk) + zww(ji,jj,jk) ) * ( zvs(ji,jj,jk-1,jtn)-zvs(ji,jj,jk,jtn) ) !* wvmask(ji,jj,jk)246 END DO247 END DO248 END DO249 DO jk = 1, jpkm1 ! Vertical momentum advection at u- and v-points250 DO jj = 2, jpjm1251 DO ji = fs_2, fs_jpim1 ! vector opt.252 ! ! vertical momentum advective trends253 zua = - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk)254 zva = - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk)255 zus(ji,jj,jk,jta) = zus(ji,jj,jk,jtb) + zua * zts256 zvs(ji,jj,jk,jta) = zvs(ji,jj,jk,jtb) + zva * zts257 END DO258 END DO259 END DO260 261 END DO ! End of sub timestepping loop262 263 zr_rdt = 1._wp / ( REAL( jnzts, wp ) * z2dtzts )264 DO jk = 1, jpkm1 ! Recover trends over the outer timestep265 DO jj = 2, jpjm1266 DO ji = fs_2, fs_jpim1 ! vector opt.267 ! ! vertical momentum advective trends268 ! ! add the trends to the general momentum trends269 ua(ji,jj,jk) = ua(ji,jj,jk) + ( zus(ji,jj,jk,jta) - ub(ji,jj,jk)) * zr_rdt270 va(ji,jj,jk) = va(ji,jj,jk) + ( zvs(ji,jj,jk,jta) - vb(ji,jj,jk)) * zr_rdt271 END DO272 END DO273 END DO274 275 IF( l_trddyn ) THEN ! save the vertical advection trends for diagnostic276 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)277 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)278 CALL trd_dyn( ztrdu, ztrdv, jpdyn_zad, kt )279 CALL wrk_dealloc( jpi, jpj, jpk, ztrdu, ztrdv )280 ENDIF281 ! ! Control print282 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' zad - Ua: ', mask1=umask, &283 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )284 !285 CALL wrk_dealloc( jpi,jpj,jpk, zwuw, zwvw, zww )286 CALL wrk_dealloc( jpi,jpj,jpk,3, zus , zvs )287 !288 IF( nn_timing == 1 ) CALL timing_stop('dyn_zad_zts')289 !290 END SUBROUTINE dyn_zad_zts291 292 134 !!====================================================================== 293 135 END MODULE dynzad -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf.F90
r8215 r8568 76 76 !!--------------------------------------------------------------------- 77 77 ! 78 IF( nn_timing == 1) CALL timing_start('dyn_zdf')78 IF( ln_timing ) CALL timing_start('dyn_zdf') 79 79 ! 80 80 IF( kt == nit000 ) THEN !* initialization … … 392 392 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 393 393 ! 394 IF( nn_timing == 1) CALL timing_stop('dyn_zdf')394 IF( ln_timing ) CALL timing_stop('dyn_zdf') 395 395 ! 396 396 END SUBROUTINE dyn_zdf -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/sshwzv.F90
r7753 r8568 22 22 USE divhor ! horizontal divergence 23 23 USE phycst ! physical constants 24 USE bdy_oce , ONLY: ln_bdy, bdytmask24 USE bdy_oce , ONLY : ln_bdy, bdytmask ! Open BounDarY 25 25 USE bdydyn2d ! bdy_ssh routine 26 26 #if defined key_agrif … … 36 36 USE lbclnk ! ocean lateral boundary condition (or mpp link) 37 37 USE lib_mpp ! MPP library 38 USE wrk_nemo ! Memory Allocation39 38 USE timing ! Timing 40 USE wet_dry 39 USE wet_dry ! Wetting/Drying flux limting 41 40 42 41 IMPLICIT NONE … … 74 73 INTEGER :: jk ! dummy loop indice 75 74 REAL(wp) :: z2dt, zcoef ! local scalars 76 REAL(wp), POINTER, DIMENSION(:,: ) :: zhdiv ! 2D workspace 77 !!---------------------------------------------------------------------- 78 ! 79 IF( nn_timing == 1 ) CALL timing_start('ssh_nxt') 80 ! 81 CALL wrk_alloc( jpi,jpj, zhdiv ) 75 REAL(wp), DIMENSION(jpi,jpj) :: zhdiv ! 2D workspace 76 !!---------------------------------------------------------------------- 77 ! 78 IF( ln_timing ) CALL timing_start('ssh_nxt') 82 79 ! 83 80 IF( kt == nit000 ) THEN … … 134 131 IF(ln_ctl) CALL prt_ctl( tab2d_1=ssha, clinfo1=' ssha - : ', mask1=tmask, ovlap=1 ) 135 132 ! 136 CALL wrk_dealloc( jpi, jpj, zhdiv ) 137 ! 138 IF( nn_timing == 1 ) CALL timing_stop('ssh_nxt') 133 IF( ln_timing ) CALL timing_stop('ssh_nxt') 139 134 ! 140 135 END SUBROUTINE ssh_nxt … … 160 155 INTEGER :: ji, jj, jk ! dummy loop indices 161 156 REAL(wp) :: z1_2dt ! local scalars 162 REAL(wp), POINTER, DIMENSION(:,: ) :: z2d 163 REAL(wp), POINTER, DIMENSION(:,:,:) :: z3d, zhdiv 164 !!---------------------------------------------------------------------- 165 ! 166 IF( nn_timing == 1 ) CALL timing_start('wzv') 157 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zhdiv 158 !!---------------------------------------------------------------------- 159 ! 160 IF( ln_timing ) CALL timing_start('wzv') 167 161 ! 168 162 IF( kt == nit000 ) THEN … … 180 174 ! 181 175 IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN ! z_tilde and layer cases 182 CALL wrk_alloc( jpi, jpj, jpk, zhdiv)176 ALLOCATE( zhdiv(jpi,jpj,jpk) ) 183 177 ! 184 178 DO jk = 1, jpkm1 … … 200 194 END DO 201 195 ! IF( ln_vvl_layer ) wn(:,:,:) = 0.e0 202 CALL wrk_dealloc( jpi, jpj, jpk,zhdiv )196 DEALLOCATE( zhdiv ) 203 197 ELSE ! z_star and linear free surface cases 204 198 DO jk = jpkm1, 1, -1 ! integrate from the bottom the hor. divergence … … 215 209 ENDIF 216 210 ! 217 IF( nn_timing == 1 )CALL timing_stop('wzv')211 IF( ln_timing ) CALL timing_stop('wzv') 218 212 ! 219 213 END SUBROUTINE wzv … … 244 238 !!---------------------------------------------------------------------- 245 239 ! 246 IF( nn_timing == 1) CALL timing_start('ssh_swp')240 IF( ln_timing ) CALL timing_start('ssh_swp') 247 241 ! 248 242 IF( kt == nit000 ) THEN … … 271 265 IF(ln_ctl) CALL prt_ctl( tab2d_1=sshb, clinfo1=' sshb - : ', mask1=tmask, ovlap=1 ) 272 266 ! 273 IF( nn_timing == 1) CALL timing_stop('ssh_swp')267 IF( ln_timing ) CALL timing_stop('ssh_swp') 274 268 ! 275 269 END SUBROUTINE ssh_swp -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/wet_dry.F90
r7646 r8568 11 11 12 12 !!---------------------------------------------------------------------- 13 !! wad_lmt : Compute the horizontal flux limiter and the limited velocity 14 !! when wetting and drying happens 15 !!---------------------------------------------------------------------- 16 USE oce ! ocean dynamics and tracers 17 USE dom_oce ! ocean space and time domain 18 USE sbc_oce, ONLY : ln_rnf ! surface boundary condition: ocean 19 USE sbcrnf ! river runoff 20 USE in_out_manager ! I/O manager 21 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 22 USE lib_mpp ! MPP library 23 USE wrk_nemo ! Memory Allocation 24 USE timing ! Timing 13 !! wad_init : initialisation of wetting and drying 14 !! wad_lmt : horizontal flux limiter and limited velocity when wetting and drying happens 15 !! wad_lmt_bt : same as wad_lmt for the barotropic stepping (dynspg_ts) 16 !!---------------------------------------------------------------------- 17 USE oce ! ocean dynamics and tracers 18 USE dom_oce ! ocean space and time domain 19 USE sbc_oce , ONLY: ln_rnf ! surface boundary condition: ocean 20 USE sbcrnf ! river runoff 21 ! 22 USE in_out_manager ! I/O manager 23 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 24 USE lib_mpp ! MPP library 25 USE timing ! Timing 25 26 26 27 IMPLICIT NONE … … 31 32 !! --------------------------------------------------------------------- 32 33 33 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: wdmask 34 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: ht_wd 35 34 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: wdmask !: u- and v- limiter 35 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: ht_wd !: wetting and drying t-pt depths 36 ! ! (can include negative depths) 36 37 37 38 LOGICAL, PUBLIC :: ln_wd !: Wetting/drying activation switch (T:on,F:off) 38 39 REAL(wp), PUBLIC :: rn_wdmin1 !: minimum water depth on dried cells 39 40 REAL(wp), PUBLIC :: rn_wdmin2 !: tolerrance of minimum water depth on dried cells 40 REAL(wp), PUBLIC :: rn_wdld !: land elevation below which wetting/drying 41 !: will be considered 41 REAL(wp), PUBLIC :: rn_wdld !: land elevation below which wetting/drying will be considered 42 42 INTEGER , PUBLIC :: nn_wdit !: maximum number of iteration for W/D limiter 43 43 … … 48 48 !! * Substitutions 49 49 # include "vectopt_loop_substitute.h90" 50 !!---------------------------------------------------------------------- 50 51 CONTAINS 51 52 … … 58 59 !! ** input : - namwad namelist 59 60 !!---------------------------------------------------------------------- 61 INTEGER :: ios, ierr ! Local integer 62 !! 60 63 NAMELIST/namwad/ ln_wd, rn_wdmin1, rn_wdmin2, rn_wdld, nn_wdit 61 INTEGER :: ios ! Local integer output status for namelist read 62 INTEGER :: ierr ! Local integer status array allocation 63 !!---------------------------------------------------------------------- 64 65 REWIND( numnam_ref ) ! Namelist namwad in reference namelist 66 ! : Parameters for Wetting/Drying 64 !!---------------------------------------------------------------------- 65 ! 66 REWIND( numnam_ref ) ! Namelist namwad in reference namelist : Parameters for Wetting/Drying 67 67 READ ( numnam_ref, namwad, IOSTAT = ios, ERR = 905) 68 68 905 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namwad in reference namelist', .TRUE.) 69 REWIND( numnam_cfg ) ! Namelist namwad in configuration namelist 70 ! : Parameters for Wetting/Drying 69 REWIND( numnam_cfg ) ! Namelist namwad in configuration namelist : Parameters for Wetting/Drying 71 70 READ ( numnam_cfg, namwad, IOSTAT = ios, ERR = 906) 72 71 906 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namwad in configuration namelist', .TRUE. ) 73 72 IF(lwm) WRITE ( numond, namwad ) 74 73 ! 75 74 IF(lwp) THEN ! control print 76 75 WRITE(numout,*) … … 103 102 !! ** Action : - calculate flux limiter and W/D flag 104 103 !!---------------------------------------------------------------------- 105 REAL(wp), DIMENSION(:,:), INTENT(inout) :: sshb1 106 REAL(wp), DIMENSION(:,:), INTENT(in ):: sshemp107 REAL(wp) , INTENT(in) ::z2dt104 REAL(wp), DIMENSION(:,:), INTENT(inout) :: sshb1 !!gm DOCTOR names: should start with p ! 105 REAL(wp), DIMENSION(:,:), INTENT(in ) :: sshemp 106 REAL(wp) , INTENT(in ) :: z2dt 108 107 ! 109 108 INTEGER :: ji, jj, jk, jk1 ! dummy loop indices … … 113 112 REAL(wp) :: zdepwd ! local scalar, always wet cell depth 114 113 REAL(wp) :: ztmp ! local scalars 115 REAL(wp), POINTER, DIMENSION(:,:) :: zwdlmtu, zwdlmtv !: W/D flux limiters 116 REAL(wp), POINTER, DIMENSION(:,:) :: zflxp, zflxn ! local 2D workspace 117 REAL(wp), POINTER, DIMENSION(:,:) :: zflxu, zflxv ! local 2D workspace 118 REAL(wp), POINTER, DIMENSION(:,:) :: zflxu1, zflxv1 ! local 2D workspace 119 !!---------------------------------------------------------------------- 120 ! 121 122 IF( nn_timing == 1 ) CALL timing_start('wad_lmt') 123 124 IF(ln_wd) THEN 125 126 CALL wrk_alloc( jpi, jpj, zflxp, zflxn, zflxu, zflxv, zflxu1, zflxv1 ) 127 CALL wrk_alloc( jpi, jpj, zwdlmtu, zwdlmtv) 128 ! 129 130 !IF(lwp) WRITE(numout,*) 131 !IF(lwp) WRITE(numout,*) 'wad_lmt : wetting/drying limiters and velocity limiting' 132 133 jflag = 0 134 zdepwd = 50._wp !maximum depth on which that W/D could possibly happen 135 136 137 zflxp(:,:) = 0._wp 138 zflxn(:,:) = 0._wp 139 zflxu(:,:) = 0._wp 140 zflxv(:,:) = 0._wp 141 142 zwdlmtu(:,:) = 1._wp 143 zwdlmtv(:,:) = 1._wp 144 145 ! Horizontal Flux in u and v direction 146 DO jk = 1, jpkm1 147 DO jj = 1, jpj 148 DO ji = 1, jpi 149 zflxu(ji,jj) = zflxu(ji,jj) + e3u_n(ji,jj,jk) * un(ji,jj,jk) * umask(ji,jj,jk) 150 zflxv(ji,jj) = zflxv(ji,jj) + e3v_n(ji,jj,jk) * vn(ji,jj,jk) * vmask(ji,jj,jk) 151 END DO 152 END DO 153 END DO 154 155 zflxu(:,:) = zflxu(:,:) * e2u(:,:) 156 zflxv(:,:) = zflxv(:,:) * e1v(:,:) 157 158 wdmask(:,:) = 1 159 DO jj = 2, jpj 160 DO ji = 2, jpi 161 162 IF( tmask(ji, jj, 1) < 0.5_wp ) CYCLE ! we don't care about land cells 163 IF( ht_wd(ji,jj) > zdepwd ) CYCLE ! and cells which are unlikely to dry 164 165 zflxp(ji,jj) = max(zflxu(ji,jj), 0._wp) - min(zflxu(ji-1,jj), 0._wp) + & 166 & max(zflxv(ji,jj), 0._wp) - min(zflxv(ji, jj-1), 0._wp) 167 zflxn(ji,jj) = min(zflxu(ji,jj), 0._wp) - max(zflxu(ji-1,jj), 0._wp) + & 168 & min(zflxv(ji,jj), 0._wp) - max(zflxv(ji, jj-1), 0._wp) 169 170 zdep2 = ht_wd(ji,jj) + sshb1(ji,jj) - rn_wdmin1 171 IF(zdep2 .le. 0._wp) THEN !add more safty, but not necessary 172 sshb1(ji,jj) = rn_wdmin1 - ht_wd(ji,jj) 173 IF(zflxu(ji, jj) > 0._wp) zwdlmtu(ji ,jj) = 0._wp 174 IF(zflxu(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = 0._wp 175 IF(zflxv(ji, jj) > 0._wp) zwdlmtv(ji ,jj) = 0._wp 176 IF(zflxv(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = 0._wp 177 wdmask(ji,jj) = 0._wp 178 END IF 179 ENDDO 180 END DO 181 182 183 !! start limiter iterations 184 DO jk1 = 1, nn_wdit + 1 185 186 187 zflxu1(:,:) = zflxu(:,:) * zwdlmtu(:,:) 188 zflxv1(:,:) = zflxv(:,:) * zwdlmtv(:,:) 189 jflag = 0 ! flag indicating if any further iterations are needed 190 191 DO jj = 2, jpj 192 DO ji = 2, jpi 193 194 IF( tmask(ji, jj, 1) < 0.5_wp ) CYCLE 195 IF( ht_wd(ji,jj) > zdepwd ) CYCLE 196 197 ztmp = e1e2t(ji,jj) 198 199 zzflxp = max(zflxu1(ji,jj), 0._wp) - min(zflxu1(ji-1,jj), 0._wp) + & 200 & max(zflxv1(ji,jj), 0._wp) - min(zflxv1(ji, jj-1), 0._wp) 201 zzflxn = min(zflxu1(ji,jj), 0._wp) - max(zflxu1(ji-1,jj), 0._wp) + & 202 & min(zflxv1(ji,jj), 0._wp) - max(zflxv1(ji, jj-1), 0._wp) 203 204 zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 205 zdep2 = ht_wd(ji,jj) + sshb1(ji,jj) - rn_wdmin1 - z2dt * sshemp(ji,jj) 206 207 IF( zdep1 > zdep2 ) THEN 208 wdmask(ji, jj) = 0 209 zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 210 !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 211 ! flag if the limiter has been used but stop flagging if the only 212 ! changes have zeroed the coefficient since further iterations will 213 ! not change anything 214 IF( zcoef > 0._wp ) THEN 215 jflag = 1 216 ELSE 217 zcoef = 0._wp 218 ENDIF 219 IF(jk1 > nn_wdit) zcoef = 0._wp 220 IF(zflxu1(ji, jj) > 0._wp) zwdlmtu(ji ,jj) = zcoef 221 IF(zflxu1(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = zcoef 222 IF(zflxv1(ji, jj) > 0._wp) zwdlmtv(ji ,jj) = zcoef 223 IF(zflxv1(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = zcoef 224 END IF 225 END DO ! ji loop 226 END DO ! jj loop 227 228 CALL lbc_lnk( zwdlmtu, 'U', 1. ) 229 CALL lbc_lnk( zwdlmtv, 'V', 1. ) 230 231 IF(lk_mpp) CALL mpp_max(jflag) !max over the global domain 232 233 IF(jflag == 0) EXIT 234 235 END DO ! jk1 loop 236 237 DO jk = 1, jpkm1 238 un(:,:,jk) = un(:,:,jk) * zwdlmtu(:, :) 239 vn(:,:,jk) = vn(:,:,jk) * zwdlmtv(:, :) 240 END DO 241 242 CALL lbc_lnk( un, 'U', -1. ) 243 CALL lbc_lnk( vn, 'V', -1. ) 244 ! 245 un_b(:,:) = un_b(:,:) * zwdlmtu(:, :) 246 vn_b(:,:) = vn_b(:,:) * zwdlmtv(:, :) 247 CALL lbc_lnk( un_b, 'U', -1. ) 248 CALL lbc_lnk( vn_b, 'V', -1. ) 249 250 IF(jflag == 1 .AND. lwp) WRITE(numout,*) 'Need more iterations in wad_lmt!!!' 251 252 !IF( ln_rnf ) CALL sbc_rnf_div( hdivn ) ! runoffs (update hdivn field) 253 !IF( nn_cla == 1 ) CALL cla_div ( kt ) ! Cross Land Advection (update hdivn field) 254 ! 255 ! 256 CALL wrk_dealloc( jpi, jpj, zflxp, zflxn, zflxu, zflxv, zflxu1, zflxv1 ) 257 CALL wrk_dealloc( jpi, jpj, zwdlmtu, zwdlmtv) 258 ! 259 ENDIF 260 ! 261 IF( nn_timing == 1 ) CALL timing_stop('wad_lmt') 114 REAL(wp), DIMENSION(jpi,jpj) :: zwdlmtu, zwdlmtv ! W/D flux limiters 115 REAL(wp), DIMENSION(jpi,jpj) :: zflxp , zflxn ! local 2D workspace 116 REAL(wp), DIMENSION(jpi,jpj) :: zflxu , zflxv ! local 2D workspace 117 REAL(wp), DIMENSION(jpi,jpj) :: zflxu1 , zflxv1 ! local 2D workspace 118 !!---------------------------------------------------------------------- 119 ! 120 IF( ln_timing ) CALL timing_start('wad_lmt') 121 ! 122 !IF(lwp) WRITE(numout,*) 123 !IF(lwp) WRITE(numout,*) 'wad_lmt : wetting/drying limiters and velocity limiting' 124 ! 125 jflag = 0 126 zdepwd = 50._wp !maximum depth on which that W/D could possibly happen 127 ! 128 zflxp(:,:) = 0._wp 129 zflxn(:,:) = 0._wp 130 zflxu(:,:) = 0._wp 131 zflxv(:,:) = 0._wp 132 ! 133 zwdlmtu(:,:) = 1._wp 134 zwdlmtv(:,:) = 1._wp 135 ! 136 ! Horizontal Flux in u and v direction 137 DO jk = 1, jpkm1 138 DO jj = 1, jpj 139 DO ji = 1, jpi 140 zflxu(ji,jj) = zflxu(ji,jj) + e3u_n(ji,jj,jk) * un(ji,jj,jk) * umask(ji,jj,jk) 141 zflxv(ji,jj) = zflxv(ji,jj) + e3v_n(ji,jj,jk) * vn(ji,jj,jk) * vmask(ji,jj,jk) 142 END DO 143 END DO 144 END DO 145 ! 146 zflxu(:,:) = zflxu(:,:) * e2u(:,:) 147 zflxv(:,:) = zflxv(:,:) * e1v(:,:) 148 ! 149 wdmask(:,:) = 1 150 DO jj = 2, jpj 151 DO ji = 2, jpi 152 ! 153 IF( tmask(ji, jj, 1) < 0.5_wp ) CYCLE ! we don't care about land cells 154 IF( ht_wd(ji,jj) > zdepwd ) CYCLE ! and cells which are unlikely to dry 155 ! 156 zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj) , 0._wp ) & 157 & + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji,jj-1) , 0._wp ) 158 zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj) , 0._wp ) & 159 & + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji,jj-1) , 0._wp ) 160 ! 161 zdep2 = ht_wd(ji,jj) + sshb1(ji,jj) - rn_wdmin1 162 IF( zdep2 .le. 0._wp) THEN !add more safty, but not necessary 163 sshb1(ji,jj) = rn_wdmin1 - ht_wd(ji,jj) 164 IF( zflxu(ji, jj) > 0._wp ) zwdlmtu(ji ,jj) = 0._wp 165 IF( zflxu(ji-1,jj) < 0._wp ) zwdlmtu(ji-1,jj) = 0._wp 166 IF( zflxv(ji, jj) > 0._wp ) zwdlmtv(ji ,jj) = 0._wp 167 IF( zflxv(ji,jj-1) < 0._wp ) zwdlmtv(ji,jj-1) = 0._wp 168 wdmask(ji,jj) = 0._wp 169 ENDIF 170 END DO 171 END DO 172 !! 173 !! start limiter iterations 174 DO jk1 = 1, nn_wdit + 1 175 ! 176 zflxu1(:,:) = zflxu(:,:) * zwdlmtu(:,:) 177 zflxv1(:,:) = zflxv(:,:) * zwdlmtv(:,:) 178 jflag = 0 ! flag indicating if any further iterations are needed 179 ! 180 DO jj = 2, jpj 181 DO ji = 2, jpi 182 ! 183 IF( tmask(ji,jj,1) < 0.5_wp ) CYCLE 184 IF( ht_wd(ji,jj) > zdepwd ) CYCLE 185 ! 186 ztmp = e1e2t(ji,jj) 187 ! 188 zzflxp = MAX( zflxu1(ji,jj) , 0._wp ) - MIN( zflxu1(ji-1,jj) , 0._wp ) & 189 & + MAX( zflxv1(ji,jj) , 0._wp ) - MIN( zflxv1(ji,jj-1) , 0._wp ) 190 zzflxn = MIN( zflxu1(ji,jj) , 0._wp ) - MAX( zflxu1(ji-1,jj) , 0._wp ) & 191 & + MIN( zflxv1(ji,jj) , 0._wp ) - MAX( zflxv1(ji,jj-1) , 0._wp ) 192 ! 193 zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 194 zdep2 = ht_wd(ji,jj) + sshb1(ji,jj) - rn_wdmin1 - z2dt * sshemp(ji,jj) 195 ! 196 IF( zdep1 > zdep2 ) THEN 197 wdmask(ji, jj) = 0 198 zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 199 !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 200 ! flag if the limiter has been used but stop flagging if the only 201 ! changes have zeroed the coefficient since further iterations will 202 ! not change anything 203 IF( zcoef > 0._wp ) THEN ; jflag = 1 204 ELSE ; zcoef = 0._wp 205 ENDIF 206 IF( jk1 > nn_wdit ) zcoef = 0._wp 207 IF( zflxu1(ji, jj) > 0._wp ) zwdlmtu(ji ,jj) = zcoef 208 IF( zflxu1(ji-1,jj) < 0._wp ) zwdlmtu(ji-1,jj) = zcoef 209 IF( zflxv1(ji, jj) > 0._wp ) zwdlmtv(ji ,jj) = zcoef 210 IF( zflxv1(ji,jj-1) < 0._wp ) zwdlmtv(ji,jj-1) = zcoef 211 ENDIF 212 END DO ! ji loop 213 END DO ! jj loop 214 ! 215 CALL lbc_lnk( zwdlmtu, 'U', 1. ) 216 CALL lbc_lnk( zwdlmtv, 'V', 1. ) 217 ! 218 IF(lk_mpp) CALL mpp_max(jflag) !max over the global domain 219 ! 220 IF(jflag == 0) EXIT 221 ! 222 END DO ! jk1 loop 223 224 DO jk = 1, jpkm1 225 un(:,:,jk) = un(:,:,jk) * zwdlmtu(:,:) 226 vn(:,:,jk) = vn(:,:,jk) * zwdlmtv(:,:) 227 END DO 228 229 !!gm ==> Andrew : the lbclnk below is useless since above lbclnk is applied on zwdlmtu/v 230 !! and un, vn always with lbclnk 231 CALL lbc_lnk( un, 'U', -1. ) 232 CALL lbc_lnk( vn, 'V', -1. ) 233 !!gm end 234 ! 235 un_b(:,:) = un_b(:,:) * zwdlmtu(:,:) 236 vn_b(:,:) = vn_b(:,:) * zwdlmtv(:,:) 237 !!gm ==> Andrew : probably same as above 238 CALL lbc_lnk( un_b, 'U', -1. ) 239 CALL lbc_lnk( vn_b, 'V', -1. ) 240 !!gm end 241 242 IF(jflag == 1 .AND. lwp) WRITE(numout,*) 'Need more iterations in wad_lmt!!!' 243 244 !IF( ln_rnf ) CALL sbc_rnf_div( hdivn ) ! runoffs (update hdivn field) 245 !IF( nn_cla == 1 ) CALL cla_div ( kt ) ! Cross Land Advection (update hdivn field) 246 ! 247 ! 248 ! 249 IF( ln_timing ) CALL timing_stop('wad_lmt') 262 250 ! 263 251 END SUBROUTINE wad_lmt … … 284 272 REAL(wp) :: zdepwd ! local scalar, always wet cell depth 285 273 REAL(wp) :: ztmp ! local scalars 286 REAL(wp), POINTER, DIMENSION(:,:) :: zwdlmtu, zwdlmtv !: W/D flux limiters 287 REAL(wp), POINTER, DIMENSION(:,:) :: zflxp, zflxn ! local 2D workspace 288 REAL(wp), POINTER, DIMENSION(:,:) :: zflxu1, zflxv1 ! local 2D workspace 289 !!---------------------------------------------------------------------- 290 ! 291 IF( nn_timing == 1 ) CALL timing_start('wad_lmt_bt') 292 293 IF(ln_wd) THEN 294 295 CALL wrk_alloc( jpi, jpj, zflxp, zflxn, zflxu1, zflxv1 ) 296 CALL wrk_alloc( jpi, jpj, zwdlmtu, zwdlmtv) 297 ! 298 299 !IF(lwp) WRITE(numout,*) 300 !IF(lwp) WRITE(numout,*) 'wad_lmt_bt : wetting/drying limiters and velocity limiting' 301 302 jflag = 0 303 zdepwd = 50._wp !maximum depth that ocean cells can have W/D processes 304 305 z2dt = rdtbt 306 307 zflxp(:,:) = 0._wp 308 zflxn(:,:) = 0._wp 309 310 zwdlmtu(:,:) = 1._wp 311 zwdlmtv(:,:) = 1._wp 312 313 ! Horizontal Flux in u and v direction 314 315 DO jj = 2, jpj 316 DO ji = 2, jpi 317 318 IF( tmask(ji, jj, 1 ) < 0.5_wp) CYCLE ! we don't care about land cells 319 IF( ht_wd(ji,jj) > zdepwd ) CYCLE ! and cells which are unlikely to dry 320 321 zflxp(ji,jj) = max(zflxu(ji,jj), 0._wp) - min(zflxu(ji-1,jj), 0._wp) + & 322 & max(zflxv(ji,jj), 0._wp) - min(zflxv(ji, jj-1), 0._wp) 323 zflxn(ji,jj) = min(zflxu(ji,jj), 0._wp) - max(zflxu(ji-1,jj), 0._wp) + & 324 & min(zflxv(ji,jj), 0._wp) - max(zflxv(ji, jj-1), 0._wp) 325 326 zdep2 = ht_wd(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 327 IF(zdep2 .le. 0._wp) THEN !add more safety, but not necessary 328 sshn_e(ji,jj) = rn_wdmin1 - ht_wd(ji,jj) 329 IF(zflxu(ji, jj) > 0._wp) zwdlmtu(ji ,jj) = 0._wp 330 IF(zflxu(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = 0._wp 331 IF(zflxv(ji, jj) > 0._wp) zwdlmtv(ji ,jj) = 0._wp 332 IF(zflxv(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = 0._wp 333 END IF 334 ENDDO 335 END DO 274 REAL(wp), DIMENSION(jpi,jpj) :: zwdlmtu, zwdlmtv !: W/D flux limiters 275 REAL(wp), DIMENSION(jpi,jpj) :: zflxp, zflxn ! local 2D workspace 276 REAL(wp), DIMENSION(jpi,jpj) :: zflxu1, zflxv1 ! local 2D workspace 277 !!---------------------------------------------------------------------- 278 ! 279 IF( ln_timing ) CALL timing_start('wad_lmt_bt') 280 ! 281 !IF(lwp) WRITE(numout,*) 282 !IF(lwp) WRITE(numout,*) 'wad_lmt_bt : wetting/drying limiters and velocity limiting' 283 284 jflag = 0 285 zdepwd = 50._wp !maximum depth that ocean cells can have W/D processes 286 287 z2dt = rdtbt 288 289 zflxp(:,:) = 0._wp 290 zflxn(:,:) = 0._wp 291 292 zwdlmtu(:,:) = 1._wp 293 zwdlmtv(:,:) = 1._wp 294 295 ! Horizontal Flux in u and v direction 296 297 DO jj = 2, jpj 298 DO ji = 2, jpi 299 ! 300 IF( tmask(ji,jj,1) < 0.5_wp ) CYCLE ! we don't care about land cells 301 IF( ht_wd(ji,jj) > zdepwd ) CYCLE ! and cells which are unlikely to dry 302 ! 303 zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj) , 0._wp ) & 304 & + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji,jj-1) , 0._wp ) 305 zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj) , 0._wp ) & 306 & + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji,jj-1) , 0._wp ) 307 308 zdep2 = ht_wd(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 309 IF(zdep2 .le. 0._wp) THEN !add more safety, but not necessary 310 sshn_e(ji,jj) = rn_wdmin1 - ht_wd(ji,jj) 311 IF( zflxu(ji, jj) > 0._wp ) zwdlmtu(ji ,jj) = 0._wp 312 IF( zflxu(ji-1,jj) < 0._wp ) zwdlmtu(ji-1,jj) = 0._wp 313 IF( zflxv(ji, jj) > 0._wp ) zwdlmtv(ji ,jj) = 0._wp 314 IF( zflxv(ji,jj-1) < 0._wp ) zwdlmtv(ji,jj-1) = 0._wp 315 ENDIF 316 END DO 317 END DO 336 318 337 319 338 !! start limiter iterations 339 DO jk1 = 1, nn_wdit + 1 340 320 !! start limiter iterations 321 DO jk1 = 1, nn_wdit + 1 322 ! 323 zflxu1(:,:) = zflxu(:,:) * zwdlmtu(:,:) 324 zflxv1(:,:) = zflxv(:,:) * zwdlmtv(:,:) 325 jflag = 0 ! flag indicating if any further iterations are needed 326 ! 327 DO jj = 2, jpj 328 DO ji = 2, jpi 329 ! 330 IF( tmask(ji,jj, 1 ) < 0.5_wp ) CYCLE 331 IF( ht_wd(ji,jj) > zdepwd ) CYCLE 332 ! 333 ztmp = e1e2t(ji,jj) 334 ! 335 zzflxp = MAX( zflxu1(ji,jj) , 0._wp ) - MIN( zflxu1(ji-1,jj) , 0._wp ) & 336 & + MAX( zflxv1(ji,jj) , 0._wp ) - MIN( zflxv1(ji,jj-1) , 0._wp ) 337 zzflxn = MIN( zflxu1(ji,jj) , 0._wp ) - MAX( zflxu1(ji-1,jj) , 0._wp ) & 338 & + MIN( zflxv1(ji,jj) , 0._wp ) - MAX( zflxv1(ji,jj-1) , 0._wp ) 341 339 342 zflxu1(:,:) = zflxu(:,:) * zwdlmtu(:,:) 343 zflxv1(:,:) = zflxv(:,:) * zwdlmtv(:,:) 344 jflag = 0 ! flag indicating if any further iterations are needed 340 zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 341 zdep2 = ht_wd(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 - z2dt * zssh_frc(ji,jj) 345 342 346 DO jj = 2, jpj 347 DO ji = 2, jpi 348 349 IF( tmask(ji, jj, 1 ) < 0.5_wp) CYCLE 350 IF( ht_wd(ji,jj) > zdepwd ) CYCLE 351 352 ztmp = e1e2t(ji,jj) 353 354 zzflxp = max(zflxu1(ji,jj), 0._wp) - min(zflxu1(ji-1,jj), 0._wp) + & 355 & max(zflxv1(ji,jj), 0._wp) - min(zflxv1(ji, jj-1), 0._wp) 356 zzflxn = min(zflxu1(ji,jj), 0._wp) - max(zflxu1(ji-1,jj), 0._wp) + & 357 & min(zflxv1(ji,jj), 0._wp) - max(zflxv1(ji, jj-1), 0._wp) 358 359 zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 360 zdep2 = ht_wd(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 - z2dt * zssh_frc(ji,jj) 361 362 IF(zdep1 > zdep2) THEN 363 zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 364 !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 365 ! flag if the limiter has been used but stop flagging if the only 366 ! changes have zeroed the coefficient since further iterations will 367 ! not change anything 368 IF( zcoef > 0._wp ) THEN 343 IF(zdep1 > zdep2) THEN 344 zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 345 !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 346 ! flag if the limiter has been used but stop flagging if the only 347 ! changes have zeroed the coefficient since further iterations will 348 ! not change anything 349 IF( zcoef > 0._wp ) THEN 369 350 jflag = 1 370 351 ELSE 371 352 zcoef = 0._wp 372 ENDIF 373 IF(jk1 > nn_wdit) zcoef = 0._wp 374 IF(zflxu1(ji, jj) > 0._wp) zwdlmtu(ji ,jj) = zcoef 375 IF(zflxu1(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = zcoef 376 IF(zflxv1(ji, jj) > 0._wp) zwdlmtv(ji ,jj) = zcoef 377 IF(zflxv1(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = zcoef 378 END IF 379 END DO ! ji loop 380 END DO ! jj loop 381 382 CALL lbc_lnk( zwdlmtu, 'U', 1. ) 383 CALL lbc_lnk( zwdlmtv, 'V', 1. ) 384 385 IF(lk_mpp) CALL mpp_max(jflag) !max over the global domain 386 387 IF(jflag == 0) EXIT 388 389 END DO ! jk1 loop 390 391 zflxu(:,:) = zflxu(:,:) * zwdlmtu(:, :) 392 zflxv(:,:) = zflxv(:,:) * zwdlmtv(:, :) 393 394 CALL lbc_lnk( zflxu, 'U', -1. ) 395 CALL lbc_lnk( zflxv, 'V', -1. ) 396 397 IF(jflag == 1 .AND. lwp) WRITE(numout,*) 'Need more iterations in wad_lmt_bt!!!' 398 399 !IF( ln_rnf ) CALL sbc_rnf_div( hdivn ) ! runoffs (update hdivn field) 400 !IF( nn_cla == 1 ) CALL cla_div ( kt ) ! Cross Land Advection (update hdivn field) 401 ! 402 ! 403 CALL wrk_dealloc( jpi, jpj, zflxp, zflxn, zflxu1, zflxv1 ) 404 CALL wrk_dealloc( jpi, jpj, zwdlmtu, zwdlmtv) 405 ! 406 END IF 407 408 IF( nn_timing == 1 ) CALL timing_stop('wad_lmt') 353 ENDIF 354 IF( jk1 > nn_wdit ) zcoef = 0._wp 355 IF( zflxu1(ji, jj) > 0._wp ) zwdlmtu(ji ,jj) = zcoef 356 IF( zflxu1(ji-1,jj) < 0._wp ) zwdlmtu(ji-1,jj) = zcoef 357 IF( zflxv1(ji, jj) > 0._wp ) zwdlmtv(ji ,jj) = zcoef 358 IF( zflxv1(ji,jj-1) < 0._wp ) zwdlmtv(ji,jj-1) = zcoef 359 ENDIF 360 END DO ! ji loop 361 END DO ! jj loop 362 ! 363 CALL lbc_lnk( zwdlmtu, 'U', 1. ) 364 CALL lbc_lnk( zwdlmtv, 'V', 1. ) 365 ! 366 IF(lk_mpp) CALL mpp_max(jflag) !max over the global domain 367 ! 368 IF( jflag == 0 ) EXIT 369 ! 370 END DO ! jk1 loop 371 ! 372 zflxu(:,:) = zflxu(:,:) * zwdlmtu(:, :) 373 zflxv(:,:) = zflxv(:,:) * zwdlmtv(:, :) 374 ! 375 CALL lbc_lnk( zflxu, 'U', -1. ) 376 CALL lbc_lnk( zflxv, 'V', -1. ) 377 ! 378 IF(jflag == 1 .AND. lwp) WRITE(numout,*) 'Need more iterations in wad_lmt_bt!!!' 379 380 !IF( ln_rnf ) CALL sbc_rnf_div( hdivn ) ! runoffs (update hdivn field) 381 !IF( nn_cla == 1 ) CALL cla_div ( kt ) ! Cross Land Advection (update hdivn field) 382 ! 383 IF( ln_timing ) CALL timing_stop('wad_lmt') 384 ! 409 385 END SUBROUTINE wad_lmt_bt 410 386
Note: See TracChangeset
for help on using the changeset viewer.