- Timestamp:
- 2017-09-27T16:29:24+02:00 (7 years ago)
- Location:
- branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA
- Files:
-
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/eosbn2.F90
r8215 r8568 46 46 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 47 47 USE prtctl ! Print control 48 USE wrk_nemo ! Memory Allocation49 48 USE lbclnk ! ocean lateral boundary conditions 50 49 USE timing ! Timing … … 231 230 !!---------------------------------------------------------------------- 232 231 ! 233 IF( nn_timing == 1) CALL timing_start('eos-insitu')232 IF( ln_timing ) CALL timing_start('eos-insitu') 234 233 ! 235 234 SELECT CASE( neos ) … … 298 297 IF(ln_ctl) CALL prt_ctl( tab3d_1=prd, clinfo1=' eos-insitu : ', ovlap=1, kdim=jpk ) 299 298 ! 300 IF( nn_timing == 1) CALL timing_stop('eos-insitu')299 IF( ln_timing ) CALL timing_stop('eos-insitu') 301 300 ! 302 301 END SUBROUTINE eos_insitu … … 329 328 !!---------------------------------------------------------------------- 330 329 ! 331 IF( nn_timing == 1) CALL timing_start('eos-pot')330 IF( ln_timing ) CALL timing_start('eos-pot') 332 331 ! 333 332 SELECT CASE ( neos ) … … 465 464 IF(ln_ctl) CALL prt_ctl( tab3d_1=prd, clinfo1=' eos-pot: ', tab3d_2=prhop, clinfo2=' pot : ', ovlap=1, kdim=jpk ) 466 465 ! 467 IF( nn_timing == 1) CALL timing_stop('eos-pot')466 IF( ln_timing ) CALL timing_stop('eos-pot') 468 467 ! 469 468 END SUBROUTINE eos_insitu_pot … … 491 490 !!---------------------------------------------------------------------- 492 491 ! 493 IF( nn_timing == 1) CALL timing_start('eos2d')492 IF( ln_timing ) CALL timing_start('eos2d') 494 493 ! 495 494 prd(:,:) = 0._wp … … 560 559 IF(ln_ctl) CALL prt_ctl( tab2d_1=prd, clinfo1=' eos2d: ' ) 561 560 ! 562 IF( nn_timing == 1) CALL timing_stop('eos2d')561 IF( ln_timing ) CALL timing_stop('eos2d') 563 562 ! 564 563 END SUBROUTINE eos_insitu_2d … … 583 582 !!---------------------------------------------------------------------- 584 583 ! 585 IF( nn_timing == 1) CALL timing_start('rab_3d')584 IF( ln_timing ) CALL timing_start('rab_3d') 586 585 ! 587 586 SELECT CASE ( neos ) … … 674 673 & tab3d_2=pab(:,:,:,jp_sal), clinfo2=' rab_3d_s : ', ovlap=1, kdim=jpk ) 675 674 ! 676 IF( nn_timing == 1) CALL timing_stop('rab_3d')675 IF( ln_timing ) CALL timing_stop('rab_3d') 677 676 ! 678 677 END SUBROUTINE rab_3d … … 696 695 !!---------------------------------------------------------------------- 697 696 ! 698 IF( nn_timing == 1 )CALL timing_start('rab_2d')697 IF( ln_timing ) CALL timing_start('rab_2d') 699 698 ! 700 699 pab(:,:,:) = 0._wp … … 791 790 & tab2d_2=pab(:,:,jp_sal), clinfo2=' rab_2d_s : ' ) 792 791 ! 793 IF( nn_timing == 1) CALL timing_stop('rab_2d')792 IF( ln_timing ) CALL timing_stop('rab_2d') 794 793 ! 795 794 END SUBROUTINE rab_2d … … 812 811 !!---------------------------------------------------------------------- 813 812 ! 814 IF( nn_timing == 1 )CALL timing_start('rab_2d')813 IF( ln_timing ) CALL timing_start('rab_2d') 815 814 ! 816 815 pab(:) = 0._wp … … 888 887 END SELECT 889 888 ! 890 IF( nn_timing == 1) CALL timing_stop('rab_2d')889 IF( ln_timing ) CALL timing_stop('rab_2d') 891 890 ! 892 891 END SUBROUTINE rab_0d … … 915 914 !!---------------------------------------------------------------------- 916 915 ! 917 IF( nn_timing == 1 )CALL timing_start('bn2')916 IF( ln_timing ) CALL timing_start('bn2') 918 917 ! 919 918 DO jk = 2, jpkm1 ! interior points only (2=< jk =< jpkm1 ) … … 935 934 IF(ln_ctl) CALL prt_ctl( tab3d_1=pn2, clinfo1=' bn2 : ', ovlap=1, kdim=jpk ) 936 935 ! 937 IF( nn_timing == 1) CALL timing_stop('bn2')936 IF( ln_timing ) CALL timing_stop('bn2') 938 937 ! 939 938 END SUBROUTINE bn2 … … 963 962 !!---------------------------------------------------------------------- 964 963 ! 965 IF ( nn_timing == 1) CALL timing_start('eos_pt_from_ct')964 IF( ln_timing ) CALL timing_start('eos_pt_from_ct') 966 965 ! 967 966 zdeltaS = 5._wp … … 994 993 END DO 995 994 ! 996 IF( nn_timing == 1) CALL timing_stop('eos_pt_from_ct')995 IF( ln_timing ) CALL timing_stop('eos_pt_from_ct') 997 996 ! 998 997 END FUNCTION eos_pt_from_ct … … 1128 1127 !!---------------------------------------------------------------------- 1129 1128 ! 1130 IF( nn_timing == 1) CALL timing_start('eos_pen')1129 IF( ln_timing ) CALL timing_start('eos_pen') 1131 1130 ! 1132 1131 SELECT CASE ( neos ) … … 1222 1221 END SELECT 1223 1222 ! 1224 IF( nn_timing == 1) CALL timing_stop('eos_pen')1223 IF( ln_timing ) CALL timing_stop('eos_pen') 1225 1224 ! 1226 1225 END SUBROUTINE eos_pen -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/traadv.F90
r7753 r8568 14 14 !!---------------------------------------------------------------------- 15 15 !! tra_adv : compute ocean tracer advection trend 16 !! tra_adv_ ctl: control the different options of advection scheme16 !! tra_adv_init : control the different options of advection scheme 17 17 !!---------------------------------------------------------------------- 18 18 USE oce ! ocean dynamics and active tracers 19 19 USE dom_oce ! ocean space and time domain 20 20 USE domvvl ! variable vertical scale factors 21 USE sbcwave ! wave module 22 USE sbc_oce ! surface boundary condition: ocean 21 23 USE traadv_cen ! centered scheme (tra_adv_cen routine) 22 24 USE traadv_fct ! FCT scheme (tra_adv_fct routine) … … 27 29 USE ldftra ! lateral diffusion: eddy diffusivity & EIV coeff. 28 30 USE ldfslp ! Lateral diffusion: slopes of neutral surfaces 29 USE trd_oce ! trends: ocean variables 30 USE trdtra ! trends manager: tracers 31 USE trd_oce ! trends: ocean variables 32 USE trdtra ! trends manager: tracers 33 USE diaptr ! Poleward heat transport 31 34 ! 32 35 USE in_out_manager ! I/O manager … … 34 37 USE prtctl ! Print control 35 38 USE lib_mpp ! MPP library 36 USE wrk_nemo ! Memory Allocation37 39 USE timing ! Timing 38 USE sbcwave ! wave module39 USE sbc_oce ! surface boundary condition: ocean40 USE diaptr ! Poleward heat transport41 40 42 41 IMPLICIT NONE 43 42 PRIVATE 44 43 45 PUBLIC tra_adv ! routine called by step module46 PUBLIC tra_adv_init ! routine called by opa module44 PUBLIC tra_adv ! called by step.F90 45 PUBLIC tra_adv_init ! called by nemogcm.F90 47 46 48 47 ! !!* Namelist namtra_adv * 48 LOGICAL :: ln_traadv_NONE ! no advection on T and S 49 49 LOGICAL :: ln_traadv_cen ! centered scheme flag 50 50 INTEGER :: nn_cen_h, nn_cen_v ! =2/4 : horizontal and vertical choices of the order of CEN scheme 51 51 LOGICAL :: ln_traadv_fct ! FCT scheme flag 52 52 INTEGER :: nn_fct_h, nn_fct_v ! =2/4 : horizontal and vertical choices of the order of FCT scheme 53 INTEGER :: nn_fct_zts ! >=1 : 2nd order FCT with vertical sub-timestepping54 53 LOGICAL :: ln_traadv_mus ! MUSCL scheme flag 55 54 LOGICAL :: ln_mus_ups ! use upstream scheme in vivcinity of river mouths … … 58 57 LOGICAL :: ln_traadv_qck ! QUICKEST scheme flag 59 58 60 INTEGER :: nadv ! choice of the type of advection scheme 61 ! 62 ! ! associated indices: 59 INTEGER :: nadv ! choice of the type of advection scheme 60 ! ! associated indices: 63 61 INTEGER, PARAMETER :: np_NO_adv = 0 ! no T-S advection 64 62 INTEGER, PARAMETER :: np_CEN = 1 ! 2nd/4th order centered scheme 65 63 INTEGER, PARAMETER :: np_FCT = 2 ! 2nd/4th order Flux Corrected Transport scheme 66 INTEGER, PARAMETER :: np_FCT_zts = 3 ! 2nd order FCT scheme with vertical sub-timestepping 67 INTEGER, PARAMETER :: np_MUS = 4 ! MUSCL scheme 68 INTEGER, PARAMETER :: np_UBS = 5 ! 3rd order Upstream Biased Scheme 69 INTEGER, PARAMETER :: np_QCK = 6 ! QUICK scheme 64 INTEGER, PARAMETER :: np_MUS = 3 ! MUSCL scheme 65 INTEGER, PARAMETER :: np_UBS = 4 ! 3rd order Upstream Biased Scheme 66 INTEGER, PARAMETER :: np_QCK = 5 ! QUICK scheme 70 67 71 68 !! * Substitutions 72 69 # include "vectopt_loop_substitute.h90" 73 70 !!---------------------------------------------------------------------- 74 !! NEMO/OPA 3.7 , NEMO Consortium (2014)71 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 75 72 !! $Id$ 76 73 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 86 83 !! ** Method : - Update (ua,va) with the advection term following nadv 87 84 !!---------------------------------------------------------------------- 88 INTEGER, INTENT( in) :: kt ! ocean time-step index85 INTEGER, INTENT(in) :: kt ! ocean time-step index 89 86 ! 90 87 INTEGER :: jk ! dummy loop index 91 REAL(wp), POINTER, DIMENSION(:,:,:) :: zun, zvn, zwn 92 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdt, ztrds ! 3D workspace 93 !!---------------------------------------------------------------------- 94 ! 95 IF( nn_timing == 1 ) CALL timing_start('tra_adv') 96 ! 97 CALL wrk_alloc( jpi,jpj,jpk, zun, zvn, zwn ) 88 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zun, zvn, zwn ! 3D workspace 89 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds 90 !!---------------------------------------------------------------------- 91 ! 92 IF( ln_timing ) CALL timing_start('tra_adv') 98 93 ! 99 94 ! ! set time step 100 zun(:,:,:) = 0.0 101 zvn(:,:,:) = 0.0 102 zwn(:,:,:) = 0.0 103 ! 104 IF( neuler == 0 .AND. kt == nit000 ) THEN ! at nit000 105 r2dt = rdt ! = rdt (restarting with Euler time stepping) 106 ELSEIF( kt <= nit000 + 1) THEN ! at nit000 or nit000+1 107 r2dt = 2._wp * rdt ! = 2 rdt (leapfrog) 95 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! at nit000 (Euler) 96 ELSEIF( kt <= nit000 + 1 ) THEN ; r2dt = 2._wp* rdt ! at nit000 or nit000+1 (Leapfrog) 108 97 ENDIF 109 98 ! 110 99 ! !== effective transport ==! 100 zun(:,:,jpk) = 0._wp 101 zvn(:,:,jpk) = 0._wp 102 zwn(:,:,jpk) = 0._wp 111 103 IF( ln_wave .AND. ln_sdw ) THEN 112 104 DO jk = 1, jpkm1 ! eulerian transport + Stokes Drift … … 146 138 ! 147 139 IF( l_trdtra ) THEN !* Save ta and sa trends 148 CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds)140 ALLOCATE( ztrdt(jpi,jpj,jpk), ztrds(jpi,jpj,jpk) ) 149 141 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 150 142 ztrds(:,:,:) = tsa(:,:,:,jp_sal) … … 153 145 SELECT CASE ( nadv ) !== compute advection trend and add it to general trend ==! 154 146 ! 155 CASE ( np_CEN ) 147 CASE ( np_CEN ) ! Centered scheme : 2nd / 4th order 156 148 CALL tra_adv_cen ( kt, nit000, 'TRA', zun, zvn, zwn , tsn, tsa, jpts, nn_cen_h, nn_cen_v ) 157 CASE ( np_FCT ) 149 CASE ( np_FCT ) ! FCT scheme : 2nd / 4th order 158 150 CALL tra_adv_fct ( kt, nit000, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts, nn_fct_h, nn_fct_v ) 159 CASE ( np_FCT_zts ) ! 2nd order FCT with vertical time-splitting 160 CALL tra_adv_fct_zts( kt, nit000, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts , nn_fct_zts ) 161 CASE ( np_MUS ) ! MUSCL 151 CASE ( np_MUS ) ! MUSCL 162 152 CALL tra_adv_mus ( kt, nit000, 'TRA', r2dt, zun, zvn, zwn, tsb, tsa, jpts , ln_mus_ups ) 163 CASE ( np_UBS ) 153 CASE ( np_UBS ) ! UBS 164 154 CALL tra_adv_ubs ( kt, nit000, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts , nn_ubs_v ) 165 CASE ( np_QCK ) 155 CASE ( np_QCK ) ! QUICKEST 166 156 CALL tra_adv_qck ( kt, nit000, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts ) 167 157 ! … … 175 165 CALL trd_tra( kt, 'TRA', jp_tem, jptra_totad, ztrdt ) 176 166 CALL trd_tra( kt, 'TRA', jp_sal, jptra_totad, ztrds ) 177 CALL wrk_dealloc( jpi, jpj, jpk,ztrdt, ztrds )167 DEALLOCATE( ztrdt, ztrds ) 178 168 ENDIF 179 169 ! ! print mean trends (used for debugging) … … 181 171 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 182 172 ! 183 IF( nn_timing == 1 ) CALL timing_stop( 'tra_adv' ) 184 ! 185 CALL wrk_dealloc( jpi,jpj,jpk, zun, zvn, zwn ) 186 ! 173 IF( ln_timing ) CALL timing_stop( 'tra_adv' ) 174 ! 187 175 END SUBROUTINE tra_adv 188 176 … … 197 185 INTEGER :: ioptio, ios ! Local integers 198 186 ! 199 NAMELIST/namtra_adv/ ln_traadv_cen, nn_cen_h, nn_cen_v, & ! CEN 200 & ln_traadv_fct, nn_fct_h, nn_fct_v, nn_fct_zts, & ! FCT 201 & ln_traadv_mus, ln_mus_ups, & ! MUSCL 202 & ln_traadv_ubs, nn_ubs_v, & ! UBS 203 & ln_traadv_qck ! QCK 187 NAMELIST/namtra_adv/ ln_traadv_NONE, & ! No advection 188 & ln_traadv_cen , nn_cen_h, nn_cen_v, & ! CEN 189 & ln_traadv_fct , nn_fct_h, nn_fct_v, & ! FCT 190 & ln_traadv_mus , ln_mus_ups, & ! MUSCL 191 & ln_traadv_ubs , nn_ubs_v, & ! UBS 192 & ln_traadv_qck ! QCK 204 193 !!---------------------------------------------------------------------- 205 194 ! … … 217 206 WRITE(numout,*) 218 207 WRITE(numout,*) 'tra_adv_init : choice/control of the tracer advection scheme' 219 WRITE(numout,*) '~~~~~~~~~~~ '208 WRITE(numout,*) '~~~~~~~~~~~~' 220 209 WRITE(numout,*) ' Namelist namtra_adv : chose a advection scheme for tracers' 210 WRITE(numout,*) ' No advection on T & S ln_traadv_NONE= ', ln_traadv_NONE 221 211 WRITE(numout,*) ' centered scheme ln_traadv_cen = ', ln_traadv_cen 222 212 WRITE(numout,*) ' horizontal 2nd/4th order nn_cen_h = ', nn_fct_h … … 225 215 WRITE(numout,*) ' horizontal 2nd/4th order nn_fct_h = ', nn_fct_h 226 216 WRITE(numout,*) ' vertical 2nd/4th order nn_fct_v = ', nn_fct_v 227 WRITE(numout,*) ' 2nd order + vertical sub-timestepping nn_fct_zts = ', nn_fct_zts228 217 WRITE(numout,*) ' MUSCL scheme ln_traadv_mus = ', ln_traadv_mus 229 218 WRITE(numout,*) ' + upstream scheme near river mouths ln_mus_ups = ', ln_mus_ups … … 233 222 ENDIF 234 223 ! 235 ioptio = 0 !== Parameter control ==! 236 IF( ln_traadv_cen ) ioptio = ioptio + 1 237 IF( ln_traadv_fct ) ioptio = ioptio + 1 238 IF( ln_traadv_mus ) ioptio = ioptio + 1 239 IF( ln_traadv_ubs ) ioptio = ioptio + 1 240 IF( ln_traadv_qck ) ioptio = ioptio + 1 241 ! 242 IF( ioptio == 0 ) THEN 243 nadv = np_NO_adv 244 CALL ctl_warn( 'tra_adv_init: You are running without tracer advection.' ) 245 ENDIF 246 IF( ioptio /= 1 ) CALL ctl_stop( 'tra_adv_init: Choose ONE advection scheme in namelist namtra_adv' ) 224 ! !== Parameter control & set nadv ==! 225 ioptio = 0 226 IF( ln_traadv_NONE ) THEN ; ioptio = ioptio + 1 ; nadv = np_NO_adv ; ENDIF 227 IF( ln_traadv_cen ) THEN ; ioptio = ioptio + 1 ; nadv = np_CEN ; ENDIF 228 IF( ln_traadv_fct ) THEN ; ioptio = ioptio + 1 ; nadv = np_FCT ; ENDIF 229 IF( ln_traadv_mus ) THEN ; ioptio = ioptio + 1 ; nadv = np_MUS ; ENDIF 230 IF( ln_traadv_ubs ) THEN ; ioptio = ioptio + 1 ; nadv = np_UBS ; ENDIF 231 IF( ln_traadv_qck ) THEN ; ioptio = ioptio + 1 ; nadv = np_QCK ; ENDIF 232 ! 233 IF( ioptio /= 1 ) CALL ctl_stop( 'tra_adv_init: Choose ONE advection option in namelist namtra_adv' ) 247 234 ! 248 235 IF( ln_traadv_cen .AND. ( nn_cen_h /= 2 .AND. nn_cen_h /= 4 ) & ! Centered … … 254 241 CALL ctl_stop( 'tra_adv_init: FCT scheme, choose 2nd or 4th order' ) 255 242 ENDIF 256 IF( ln_traadv_fct .AND. nn_fct_zts > 0 ) THEN257 IF( nn_fct_h == 4 ) THEN258 nn_fct_h = 2259 CALL ctl_stop( 'tra_adv_init: force 2nd order FCT scheme, 4th order does not exist with sub-timestepping' )260 ENDIF261 IF( .NOT.ln_linssh ) THEN262 CALL ctl_stop( 'tra_adv_init: vertical sub-timestepping not allow in non-linear free surface' )263 ENDIF264 IF( nn_fct_zts == 1 ) CALL ctl_warn( 'tra_adv_init: FCT with ONE sub-timestep = FCT without sub-timestep' )265 ENDIF266 243 IF( ln_traadv_ubs .AND. ( nn_ubs_v /= 2 .AND. nn_ubs_v /= 4 ) ) THEN ! UBS 267 244 CALL ctl_stop( 'tra_adv_init: UBS scheme, choose 2nd or 4th order' ) … … 275 252 ENDIF 276 253 ! 277 ! !== used advection scheme ==! 278 ! ! set nadv 279 IF( ln_traadv_cen ) nadv = np_CEN 280 IF( ln_traadv_fct ) nadv = np_FCT 281 IF( ln_traadv_fct .AND. nn_fct_zts > 0 ) nadv = np_FCT_zts 282 IF( ln_traadv_mus ) nadv = np_MUS 283 IF( ln_traadv_ubs ) nadv = np_UBS 284 IF( ln_traadv_qck ) nadv = np_QCK 285 ! 286 IF(lwp) THEN ! Print the choice 254 ! !== Print the choice ==! 255 IF(lwp) THEN 287 256 WRITE(numout,*) 288 257 SELECT CASE ( nadv ) … … 292 261 CASE( np_FCT ) ; WRITE(numout,*) ' ===>> FCT scheme is used. Horizontal order: ', nn_fct_h, & 293 262 & ' Vertical order: ', nn_fct_v 294 CASE( np_FCT_zts ) ; WRITE(numout,*) ' ===>> use 2nd order FCT with ', nn_fct_zts,'vertical sub-timestepping'295 263 CASE( np_MUS ) ; WRITE(numout,*) ' ===>> MUSCL scheme is used' 296 264 CASE( np_UBS ) ; WRITE(numout,*) ' ===>> UBS scheme is used' -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_cen.F90
r7646 r8568 11 11 !! NB: on the vertical it is actually a 4th order COMPACT scheme which is used 12 12 !!---------------------------------------------------------------------- 13 USE oce , ONLY: tsn ! now ocean temperature and salinity14 13 USE dom_oce ! ocean space and time domain 15 14 USE eosbn2 ! equation of state … … 24 23 USE trc_oce ! share passive tracers/Ocean variables 25 24 USE lib_mpp ! MPP library 26 USE wrk_nemo ! Memory Allocation27 25 USE timing ! Timing 28 26 … … 30 28 PRIVATE 31 29 32 PUBLIC tra_adv_cen ! routine called by step.F9030 PUBLIC tra_adv_cen ! called by traadv.F90 33 31 34 32 REAL(wp) :: r1_6 = 1._wp / 6._wp ! =1/6 35 33 36 LOGICAL :: l_trd ! flag to compute trends37 LOGICAL :: l_ptr ! flag to compute poleward transport38 LOGICAL :: l_hst ! flag to compute heat/salt transport34 LOGICAL :: l_trd ! flag to compute trends 35 LOGICAL :: l_ptr ! flag to compute poleward transport 36 LOGICAL :: l_hst ! flag to compute heat/salt transport 39 37 40 38 !! * Substitutions 41 39 # include "vectopt_loop_substitute.h90" 42 40 !!---------------------------------------------------------------------- 43 !! NEMO/OPA 3.7 , NEMO Consortium (2014)44 !! $Id $41 !! NEMO/OPA 4.0, NEMO Consortium (2017) 42 !! $Id:$ 45 43 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 46 44 !!---------------------------------------------------------------------- … … 48 46 49 47 SUBROUTINE tra_adv_cen( kt, kit000, cdtype, pun, pvn, pwn, & 50 & 48 & ptn, pta, kjpt, kn_cen_h, kn_cen_v ) 51 49 !!---------------------------------------------------------------------- 52 50 !! *** ROUTINE tra_adv_cen *** … … 80 78 REAL(wp) :: zC2t_u, zC4t_u ! local scalars 81 79 REAL(wp) :: zC2t_v, zC4t_v ! - - 82 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwx, zwy, zwz, ztu, ztv, ztw80 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwx, zwy, zwz, ztu, ztv, ztw 83 81 !!---------------------------------------------------------------------- 84 82 ! 85 IF( nn_timing == 1 ) CALL timing_start('tra_adv_cen') 86 ! 87 CALL wrk_alloc( jpi,jpj,jpk, zwx, zwy, zwz, ztu, ztv, ztw ) 83 IF( ln_timing ) CALL timing_start('tra_adv_cen') 88 84 ! 89 85 IF( kt == kit000 ) THEN … … 92 88 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~ ' 93 89 ENDIF 94 ! 90 ! ! set local switches 95 91 l_trd = .FALSE. 96 92 l_hst = .FALSE. … … 130 126 END DO 131 127 END DO 132 CALL lbc_lnk( ztu, 'U', -1. ) ; CALL lbc_lnk( ztv, 'V', -1. ) ! Lateral boundary cond. (unchanged sgn)128 CALL lbc_lnk( ztu, 'U', -1. ) ; CALL lbc_lnk( ztv, 'V', -1. ) ! Lateral boundary cond. 133 129 ! 134 130 DO jk = 1, jpkm1 ! Horizontal advective fluxes … … 203 199 END IF 204 200 ! ! "Poleward" heat and salt transports 205 IF( l_ptr ) CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) )201 IF( l_ptr ) CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) ) 206 202 ! ! heat and salt transport 207 IF( l_hst ) CALL dia_ar5_hst( jn, 'adv', zwx(:,:,:), zwy(:,:,:) )203 IF( l_hst ) CALL dia_ar5_hst( jn, 'adv', zwx(:,:,:), zwy(:,:,:) ) 208 204 ! 209 205 END DO 210 206 ! 211 CALL wrk_dealloc( jpi,jpj,jpk, zwx, zwy, zwz, ztu, ztv, ztw ) 212 ! 213 IF( nn_timing == 1 ) CALL timing_stop('tra_adv_cen') 207 IF( ln_timing ) CALL timing_stop('tra_adv_cen') 214 208 ! 215 209 END SUBROUTINE tra_adv_cen -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_fct.F90
r7753 r8568 9 9 !!---------------------------------------------------------------------- 10 10 !! tra_adv_fct : update the tracer trend with a 3D advective trends using a 2nd or 4th order FCT scheme 11 !! tra_adv_fct_zts: update the tracer trend with a 3D advective trends using a 2nd order FCT scheme12 11 !! with sub-time-stepping in the vertical direction 13 12 !! nonosc : compute monotonic tracer fluxes by a non-oscillatory algorithm … … 21 20 USE diaptr ! poleward transport diagnostics 22 21 USE diaar5 ! AR5 diagnostics 23 USE phycst , ONLY: rau0_rcp22 USE phycst , ONLY : rau0_rcp 24 23 ! 25 24 USE in_out_manager ! I/O manager 26 USE iom 25 USE iom ! 27 26 USE lib_mpp ! MPP library 28 27 USE lbclnk ! ocean lateral boundary condition (or mpp link) 29 28 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 30 USE wrk_nemo ! Memory Allocation31 29 USE timing ! Timing 32 30 … … 34 32 PRIVATE 35 33 36 PUBLIC tra_adv_fct ! routine called by traadv.F90 37 PUBLIC tra_adv_fct_zts ! routine called by traadv.F90 38 PUBLIC interp_4th_cpt ! routine called by traadv_cen.F90 34 PUBLIC tra_adv_fct ! called by traadv.F90 35 PUBLIC interp_4th_cpt ! called by traadv_cen.F90 39 36 40 37 LOGICAL :: l_trd ! flag to compute trends … … 50 47 # include "vectopt_loop_substitute.h90" 51 48 !!---------------------------------------------------------------------- 52 !! NEMO/OPA 3.7 , NEMO Consortium (2014)49 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 53 50 !! $Id$ 54 51 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 70 67 !! 71 68 !! ** Action : - update pta with the now advective tracer trends 72 !! - send trends to trdtra module for further diagnost cs (l_trdtra=T)69 !! - send trends to trdtra module for further diagnostics (l_trdtra=T) 73 70 !! - htr_adv, str_adv : poleward advective heat and salt transport (ln_diaptr=T) 74 71 !!---------------------------------------------------------------------- … … 88 85 REAL(wp) :: zfp_ui, zfp_vj, zfp_wk, zC2t_u, zC4t_u ! - - 89 86 REAL(wp) :: zfm_ui, zfm_vj, zfm_wk, zC2t_v, zC4t_v ! - - 90 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw 91 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdx, ztrdy, ztrdz, zptry 92 REAL(wp), POINTER, DIMENSION(:,:) :: z2d 93 !!---------------------------------------------------------------------- 94 ! 95 IF( nn_timing == 1 ) CALL timing_start('tra_adv_fct') 96 ! 97 CALL wrk_alloc( jpi,jpj,jpk, zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw ) 87 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw 88 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdx, ztrdy, ztrdz, zptry 89 !!---------------------------------------------------------------------- 90 ! 91 IF( ln_timing ) CALL timing_start('tra_adv_fct') 98 92 ! 99 93 IF( kt == kit000 ) THEN … … 103 97 ENDIF 104 98 ! 105 l_trd = .FALSE. 99 l_trd = .FALSE. ! set local switches 106 100 l_hst = .FALSE. 107 101 l_ptr = .FALSE. 108 IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )l_trd = .TRUE.109 IF( cdtype == 'TRA' .AND. ln_diaptr )l_ptr = .TRUE.110 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR.&111 & 102 IF( ( cdtype =='TRA' .AND. l_trdtra ) .OR. ( cdtype =='TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 103 IF( cdtype =='TRA' .AND. ln_diaptr ) l_ptr = .TRUE. 104 IF( cdtype =='TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 105 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE. 112 106 ! 113 107 IF( l_trd .OR. l_hst ) THEN 114 CALL wrk_alloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz)108 ALLOCATE( ztrdx(jpi,jpj,jpk), ztrdy(jpi,jpj,jpk), ztrdz(jpi,jpj,jpk) ) 115 109 ztrdx(:,:,:) = 0._wp ; ztrdy(:,:,:) = 0._wp ; ztrdz(:,:,:) = 0._wp 116 110 ENDIF 117 111 ! 118 112 IF( l_ptr ) THEN 119 CALL wrk_alloc( jpi, jpj, jpk, zptry)113 ALLOCATE( zptry(jpi,jpj,jpk) ) 120 114 zptry(:,:,:) = 0._wp 121 115 ENDIF … … 184 178 END IF 185 179 ! ! "Poleward" heat and salt transports (contribution of upstream fluxes) 186 IF( l_ptr ) zptry(:,:,:) = zwy(:,:,:)180 IF( l_ptr ) zptry(:,:,:) = zwy(:,:,:) 187 181 ! 188 182 ! !== anti-diffusive flux : high order minus low order ==! … … 308 302 END DO 309 303 ! 310 IF( l_trd .OR. l_hst ) THEN ! trend diagnostics (contribution of upstream fluxes) 311 ztrdx(:,:,:) = ztrdx(:,:,:) + zwx(:,:,:) ! <<< Add to previously computed 312 ztrdy(:,:,:) = ztrdy(:,:,:) + zwy(:,:,:) ! <<< Add to previously computed 313 ztrdz(:,:,:) = ztrdz(:,:,:) + zwz(:,:,:) ! <<< Add to previously computed 304 IF( l_trd .OR. l_hst ) THEN ! trend diagnostics // heat/salt transport 305 ztrdx(:,:,:) = ztrdx(:,:,:) + zwx(:,:,:) ! <<< add anti-diffusive fluxes 306 ztrdy(:,:,:) = ztrdy(:,:,:) + zwy(:,:,:) ! to upstream fluxes 307 ztrdz(:,:,:) = ztrdz(:,:,:) + zwz(:,:,:) ! 308 ! 309 IF( l_trd ) THEN ! trend diagnostics 310 CALL trd_tra( kt, cdtype, jn, jptra_xad, ztrdx, pun, ptn(:,:,:,jn) ) 311 CALL trd_tra( kt, cdtype, jn, jptra_yad, ztrdy, pvn, ptn(:,:,:,jn) ) 312 CALL trd_tra( kt, cdtype, jn, jptra_zad, ztrdz, pwn, ptn(:,:,:,jn) ) 313 ENDIF 314 ! ! heat/salt transport 315 IF( l_hst ) CALL dia_ar5_hst( jn, 'adv', ztrdx(:,:,:), ztrdy(:,:,:) ) 316 ! 317 DEALLOCATE( ztrdx, ztrdy, ztrdz ) 314 318 ENDIF 315 ! 316 IF( l_trd ) THEN 317 CALL trd_tra( kt, cdtype, jn, jptra_xad, ztrdx, pun, ptn(:,:,:,jn) ) 318 CALL trd_tra( kt, cdtype, jn, jptra_yad, ztrdy, pvn, ptn(:,:,:,jn) ) 319 CALL trd_tra( kt, cdtype, jn, jptra_zad, ztrdz, pwn, ptn(:,:,:,jn) ) 320 ! 321 END IF 322 ! ! heat/salt transport 323 IF( l_hst ) CALL dia_ar5_hst( jn, 'adv', ztrdx(:,:,:), ztrdy(:,:,:) ) 324 325 ! ! "Poleward" heat and salt transports (contribution of upstream fluxes) 326 IF( l_ptr ) THEN 327 zptry(:,:,:) = zptry(:,:,:) + zwy(:,:,:) ! <<< Add to previously computed 319 IF( l_ptr ) THEN ! "Poleward" transports 320 zptry(:,:,:) = zptry(:,:,:) + zwy(:,:,:) ! <<< add anti-diffusive fluxes 328 321 CALL dia_ptr_hst( jn, 'adv', zptry(:,:,:) ) 322 DEALLOCATE( zptry ) 329 323 ENDIF 330 324 ! 331 325 END DO ! end of tracer loop 332 326 ! 333 CALL wrk_dealloc( jpi,jpj,jpk, zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw ) 334 IF( l_trd .OR. l_hst ) CALL wrk_dealloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz ) 335 IF( l_ptr ) CALL wrk_dealloc( jpi, jpj, jpk, zptry ) 336 ! 337 IF( nn_timing == 1 ) CALL timing_stop('tra_adv_fct') 327 IF( ln_timing ) CALL timing_stop('tra_adv_fct') 338 328 ! 339 329 END SUBROUTINE tra_adv_fct 340 341 342 SUBROUTINE tra_adv_fct_zts( kt, kit000, cdtype, p2dt, pun, pvn, pwn, &343 & ptb, ptn, pta, kjpt, kn_fct_zts )344 !!----------------------------------------------------------------------345 !! *** ROUTINE tra_adv_fct_zts ***346 !!347 !! ** Purpose : Compute the now trend due to total advection of348 !! tracers and add it to the general trend of tracer equations349 !!350 !! ** Method : TVD ZTS scheme, i.e. 2nd order centered scheme with351 !! corrected flux (monotonic correction). This version use sub-352 !! timestepping for the vertical advection which increases stability353 !! when vertical metrics are small.354 !! note: - this advection scheme needs a leap-frog time scheme355 !!356 !! ** Action : - update (pta) with the now advective tracer trends357 !! - save the trends358 !!----------------------------------------------------------------------359 INTEGER , INTENT(in ) :: kt ! ocean time-step index360 INTEGER , INTENT(in ) :: kit000 ! first time step index361 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator)362 INTEGER , INTENT(in ) :: kjpt ! number of tracers363 INTEGER , INTENT(in ) :: kn_fct_zts ! number of number of vertical sub-timesteps364 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step365 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components366 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields367 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend368 !369 REAL(wp), DIMENSION( jpk ) :: zts ! length of sub-timestep for vertical advection370 REAL(wp) :: zr_p2dt ! reciprocal of tracer timestep371 INTEGER :: ji, jj, jk, jl, jn ! dummy loop indices372 INTEGER :: jtb, jtn, jta ! sub timestep pointers for leap-frog/euler forward steps373 INTEGER :: jtaken ! toggle for collecting appropriate fluxes from sub timesteps374 REAL(wp) :: z_rzts ! Fractional length of Euler forward sub-timestep for vertical advection375 REAL(wp) :: ztra ! local scalar376 REAL(wp) :: zfp_ui, zfp_vj, zfp_wk ! - -377 REAL(wp) :: zfm_ui, zfm_vj, zfm_wk ! - -378 REAL(wp), POINTER, DIMENSION(:,: ) :: zwx_sav , zwy_sav379 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwi, zwx, zwy, zwz, zhdiv, zwzts, zwz_sav380 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdx, ztrdy, ztrdz381 REAL(wp), POINTER, DIMENSION(:,:,:) :: zptry382 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztrs383 !!----------------------------------------------------------------------384 !385 IF( nn_timing == 1 ) CALL timing_start('tra_adv_fct_zts')386 !387 CALL wrk_alloc( jpi,jpj, zwx_sav, zwy_sav )388 CALL wrk_alloc( jpi,jpj,jpk, zwx, zwy, zwz, zwi, zhdiv, zwzts, zwz_sav )389 CALL wrk_alloc( jpi,jpj,jpk,kjpt+1, ztrs )390 !391 IF( kt == kit000 ) THEN392 IF(lwp) WRITE(numout,*)393 IF(lwp) WRITE(numout,*) 'tra_adv_fct_zts : 2nd order FCT scheme with ', kn_fct_zts, ' vertical sub-timestep on ', cdtype394 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'395 ENDIF396 !397 l_trd = .FALSE.398 l_hst = .FALSE.399 l_ptr = .FALSE.400 IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE.401 IF( cdtype == 'TRA' .AND. ln_diaptr ) l_ptr = .TRUE.402 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. &403 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE.404 !405 IF( l_trd .OR. l_hst ) THEN406 CALL wrk_alloc( jpi,jpj,jpk, ztrdx, ztrdy, ztrdz )407 ztrdx(:,:,:) = 0._wp ; ztrdy(:,:,:) = 0._wp ; ztrdz(:,:,:) = 0._wp408 ENDIF409 !410 IF( l_ptr ) THEN411 CALL wrk_alloc( jpi, jpj,jpk, zptry )412 zptry(:,:,:) = 0._wp413 ENDIF414 zwi(:,:,:) = 0._wp415 z_rzts = 1._wp / REAL( kn_fct_zts, wp )416 zr_p2dt = 1._wp / p2dt417 !418 ! surface & Bottom value : flux set to zero for all tracers419 zwz(:,:, 1 ) = 0._wp420 zwx(:,:,jpk) = 0._wp ; zwz(:,:,jpk) = 0._wp421 zwy(:,:,jpk) = 0._wp ; zwi(:,:,jpk) = 0._wp422 !423 ! ! ===========424 DO jn = 1, kjpt ! tracer loop425 ! ! ===========426 !427 ! Upstream advection with initial mass fluxes & intermediate update428 DO jk = 1, jpkm1 ! upstream tracer flux in the i and j direction429 DO jj = 1, jpjm1430 DO ji = 1, fs_jpim1 ! vector opt.431 ! upstream scheme432 zfp_ui = pun(ji,jj,jk) + ABS( pun(ji,jj,jk) )433 zfm_ui = pun(ji,jj,jk) - ABS( pun(ji,jj,jk) )434 zfp_vj = pvn(ji,jj,jk) + ABS( pvn(ji,jj,jk) )435 zfm_vj = pvn(ji,jj,jk) - ABS( pvn(ji,jj,jk) )436 zwx(ji,jj,jk) = 0.5_wp * ( zfp_ui * ptb(ji,jj,jk,jn) + zfm_ui * ptb(ji+1,jj ,jk,jn) )437 zwy(ji,jj,jk) = 0.5_wp * ( zfp_vj * ptb(ji,jj,jk,jn) + zfm_vj * ptb(ji ,jj+1,jk,jn) )438 END DO439 END DO440 END DO441 ! ! upstream tracer flux in the k direction442 DO jk = 2, jpkm1 ! Interior value443 DO jj = 1, jpj444 DO ji = 1, jpi445 zfp_wk = pwn(ji,jj,jk) + ABS( pwn(ji,jj,jk) )446 zfm_wk = pwn(ji,jj,jk) - ABS( pwn(ji,jj,jk) )447 zwz(ji,jj,jk) = 0.5_wp * ( zfp_wk * ptb(ji,jj,jk,jn) + zfm_wk * ptb(ji,jj,jk-1,jn) ) * wmask(ji,jj,jk)448 END DO449 END DO450 END DO451 IF( ln_linssh ) THEN ! top value : linear free surface case only (as zwz is multiplied by wmask)452 IF( ln_isfcav ) THEN ! ice-shelf cavities: top value453 DO jj = 1, jpj454 DO ji = 1, jpi455 zwz(ji,jj, mikt(ji,jj) ) = pwn(ji,jj,mikt(ji,jj)) * ptb(ji,jj,mikt(ji,jj),jn)456 END DO457 END DO458 ELSE ! no cavities, surface value459 zwz(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn)460 ENDIF461 ENDIF462 !463 DO jk = 1, jpkm1 ! total advective trend464 DO jj = 2, jpjm1465 DO ji = fs_2, fs_jpim1 ! vector opt.466 ! ! total intermediate advective trends467 ztra = - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) &468 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) &469 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj)470 ! ! update and guess with monotonic sheme471 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra / e3t_n(ji,jj,jk) * tmask(ji,jj,jk)472 zwi(ji,jj,jk) = ( e3t_b(ji,jj,jk) * ptb(ji,jj,jk,jn) + p2dt * ztra ) / e3t_a(ji,jj,jk) * tmask(ji,jj,jk)473 END DO474 END DO475 END DO476 !477 CALL lbc_lnk( zwi, 'T', 1. ) ! Lateral boundary conditions on zwi (unchanged sign)478 !479 IF( l_trd .OR. l_hst ) THEN ! trend diagnostics (contribution of upstream fluxes)480 ztrdx(:,:,:) = zwx(:,:,:) ; ztrdy(:,:,:) = zwy(:,:,:) ; ztrdz(:,:,:) = zwz(:,:,:)481 END IF482 ! ! "Poleward" heat and salt transports (contribution of upstream fluxes)483 IF( l_ptr ) zptry(:,:,:) = zwy(:,:,:)484 485 ! 3. anti-diffusive flux : high order minus low order486 ! ---------------------------------------------------487 488 DO jk = 1, jpkm1 !* horizontal anti-diffusive fluxes489 !490 DO jj = 1, jpjm1491 DO ji = 1, fs_jpim1 ! vector opt.492 zwx_sav(ji,jj) = zwx(ji,jj,jk)493 zwy_sav(ji,jj) = zwy(ji,jj,jk)494 !495 zwx(ji,jj,jk) = 0.5_wp * pun(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji+1,jj,jk,jn) )496 zwy(ji,jj,jk) = 0.5_wp * pvn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj+1,jk,jn) )497 END DO498 END DO499 !500 DO jj = 2, jpjm1 ! partial horizontal divergence501 DO ji = fs_2, fs_jpim1502 zhdiv(ji,jj,jk) = ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk) &503 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk) )504 END DO505 END DO506 !507 DO jj = 1, jpjm1508 DO ji = 1, fs_jpim1 ! vector opt.509 zwx(ji,jj,jk) = zwx(ji,jj,jk) - zwx_sav(ji,jj)510 zwy(ji,jj,jk) = zwy(ji,jj,jk) - zwy_sav(ji,jj)511 END DO512 END DO513 END DO514 !515 ! !* vertical anti-diffusive flux516 zwz_sav(:,:,:) = zwz(:,:,:)517 ztrs (:,:,:,1) = ptb(:,:,:,jn)518 ztrs (:,:,1,2) = ptb(:,:,1,jn)519 ztrs (:,:,1,3) = ptb(:,:,1,jn)520 zwzts (:,:,:) = 0._wp521 !522 DO jl = 1, kn_fct_zts ! Start of sub timestepping loop523 !524 IF( jl == 1 ) THEN ! Euler forward to kick things off525 jtb = 1 ; jtn = 1 ; jta = 2526 zts(:) = p2dt * z_rzts527 jtaken = MOD( kn_fct_zts + 1 , 2) ! Toggle to collect every second flux528 ! ! starting at jl =1 if kn_fct_zts is odd;529 ! ! starting at jl =2 otherwise530 ELSEIF( jl == 2 ) THEN ! First leapfrog step531 jtb = 1 ; jtn = 2 ; jta = 3532 zts(:) = 2._wp * p2dt * z_rzts533 ELSE ! Shuffle pointers for subsequent leapfrog steps534 jtb = MOD(jtb,3) + 1535 jtn = MOD(jtn,3) + 1536 jta = MOD(jta,3) + 1537 ENDIF538 DO jk = 2, jpkm1 ! interior value539 DO jj = 2, jpjm1540 DO ji = fs_2, fs_jpim1541 zwz(ji,jj,jk) = 0.5_wp * pwn(ji,jj,jk) * ( ztrs(ji,jj,jk,jtn) + ztrs(ji,jj,jk-1,jtn) ) * wmask(ji,jj,jk)542 IF( jtaken == 0 ) zwzts(ji,jj,jk) = zwzts(ji,jj,jk) + zwz(ji,jj,jk) * zts(jk) ! Accumulate time-weighted vertcal flux543 END DO544 END DO545 END DO546 IF( ln_linssh ) THEN ! top value (only in linear free surface case)547 IF( ln_isfcav ) THEN ! ice-shelf cavities548 DO jj = 1, jpj549 DO ji = 1, jpi550 zwz(ji,jj, mikt(ji,jj) ) = pwn(ji,jj,mikt(ji,jj)) * ptb(ji,jj,mikt(ji,jj),jn) ! linear free surface551 END DO552 END DO553 ELSE ! no ocean cavities554 zwz(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn)555 ENDIF556 ENDIF557 !558 jtaken = MOD( jtaken + 1 , 2 )559 !560 DO jk = 2, jpkm1 ! total advective trends561 DO jj = 2, jpjm1562 DO ji = fs_2, fs_jpim1563 ztrs(ji,jj,jk,jta) = ztrs(ji,jj,jk,jtb) &564 & - zts(jk) * ( zhdiv(ji,jj,jk) + zwz(ji,jj,jk) - zwz(ji,jj,jk+1) ) &565 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk)566 END DO567 END DO568 END DO569 !570 END DO571 572 DO jk = 2, jpkm1 ! Anti-diffusive vertical flux using average flux from the sub-timestepping573 DO jj = 2, jpjm1574 DO ji = fs_2, fs_jpim1575 zwz(ji,jj,jk) = ( zwzts(ji,jj,jk) * zr_p2dt - zwz_sav(ji,jj,jk) ) * wmask(ji,jj,jk)576 END DO577 END DO578 END DO579 CALL lbc_lnk( zwx, 'U', -1. ) ; CALL lbc_lnk( zwy, 'V', -1. ) ! Lateral bondary conditions580 CALL lbc_lnk( zwz, 'W', 1. )581 582 ! 4. monotonicity algorithm583 ! -------------------------584 CALL nonosc( ptb(:,:,:,jn), zwx, zwy, zwz, zwi, p2dt )585 586 587 ! 5. final trend with corrected fluxes588 ! ------------------------------------589 DO jk = 1, jpkm1590 DO jj = 2, jpjm1591 DO ji = fs_2, fs_jpim1 ! vector opt.592 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ( zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) &593 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) &594 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk)595 END DO596 END DO597 END DO598 599 !600 IF( l_trd .OR. l_hst ) THEN ! trend diagnostics (contribution of upstream fluxes)601 ztrdx(:,:,:) = ztrdx(:,:,:) + zwx(:,:,:) ! <<< Add to previously computed602 ztrdy(:,:,:) = ztrdy(:,:,:) + zwy(:,:,:) ! <<< Add to previously computed603 ztrdz(:,:,:) = ztrdz(:,:,:) + zwz(:,:,:) ! <<< Add to previously computed604 ENDIF605 !606 IF( l_trd ) THEN607 CALL trd_tra( kt, cdtype, jn, jptra_xad, ztrdx, pun, ptn(:,:,:,jn) )608 CALL trd_tra( kt, cdtype, jn, jptra_yad, ztrdy, pvn, ptn(:,:,:,jn) )609 CALL trd_tra( kt, cdtype, jn, jptra_zad, ztrdz, pwn, ptn(:,:,:,jn) )610 !611 END IF612 ! ! heat/salt transport613 IF( l_hst ) CALL dia_ar5_hst( jn, 'adv', ztrdx(:,:,:), ztrdy(:,:,:) )614 615 ! ! "Poleward" heat and salt transports (contribution of upstream fluxes)616 IF( l_ptr ) THEN617 zptry(:,:,:) = zptry(:,:,:) + zwy(:,:,:) ! <<< Add to previously computed618 CALL dia_ptr_hst( jn, 'adv', zptry(:,:,:) )619 ENDIF620 !621 END DO622 !623 CALL wrk_alloc( jpi,jpj, zwx_sav, zwy_sav )624 CALL wrk_alloc( jpi,jpj, jpk, zwx, zwy, zwz, zwi, zhdiv, zwzts, zwz_sav )625 CALL wrk_alloc( jpi,jpj,jpk,kjpt+1, ztrs )626 IF( l_trd .OR. l_hst ) CALL wrk_dealloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz )627 IF( l_ptr ) CALL wrk_dealloc( jpi, jpj, jpk, zptry )628 !629 IF( nn_timing == 1 ) CALL timing_stop('tra_adv_fct_zts')630 !631 END SUBROUTINE tra_adv_fct_zts632 330 633 331 … … 653 351 REAL(wp) :: zpos, zneg, zbt, za, zb, zc, zbig, zrtrn ! local scalars 654 352 REAL(wp) :: zau, zbu, zcu, zav, zbv, zcv, zup, zdo ! - - 655 REAL(wp), POINTER, DIMENSION(:,:,:) :: zbetup, zbetdo, zbup, zbdo 656 !!---------------------------------------------------------------------- 657 ! 658 IF( nn_timing == 1 ) CALL timing_start('nonosc') 659 ! 660 CALL wrk_alloc( jpi, jpj, jpk, zbetup, zbetdo, zbup, zbdo ) 353 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zbetup, zbetdo, zbup, zbdo 354 !!---------------------------------------------------------------------- 355 ! 356 IF( ln_timing ) CALL timing_start('nonosc') 661 357 ! 662 358 zbig = 1.e+40_wp … … 734 430 CALL lbc_lnk( paa, 'U', -1. ) ; CALL lbc_lnk( pbb, 'V', -1. ) ! lateral boundary condition (changed sign) 735 431 ! 736 CALL wrk_dealloc( jpi, jpj, jpk, zbetup, zbetdo, zbup, zbdo ) 737 ! 738 IF( nn_timing == 1 ) CALL timing_stop('nonosc') 432 IF( ln_timing ) CALL timing_stop('nonosc') 739 433 ! 740 434 END SUBROUTINE nonosc -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_mle.F90
r7753 r8568 15 15 USE phycst ! physical constant 16 16 USE zdfmxl ! mixed layer depth 17 ! 17 18 USE lbclnk ! lateral boundary condition / mpp link 18 19 USE in_out_manager ! I/O manager 19 20 USE iom ! IOM library 20 21 USE lib_mpp ! MPP library 21 USE wrk_nemo ! work arrays22 22 USE timing ! Timing 23 23 … … 86 86 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pw ! increased by the MLE induced transport 87 87 ! 88 INTEGER :: ji, jj, jk ! dummy loop indices 89 INTEGER :: ikmax ! temporary integer 90 REAL(wp) :: zcuw, zmuw ! local scalar 91 REAL(wp) :: zcvw, zmvw ! - - 92 REAL(wp) :: zc ! - - 93 ! 94 INTEGER :: ii, ij, ik ! local integers 95 INTEGER, DIMENSION(3) :: ilocu ! 96 INTEGER, DIMENSION(2) :: ilocs ! 97 REAL(wp), POINTER, DIMENSION(:,: ) :: zpsim_u, zpsim_v, zmld, zbm, zhu, zhv, zn2, zLf_NH, zLf_MH 98 REAL(wp), POINTER, DIMENSION(:,:,:) :: zpsi_uw, zpsi_vw 99 INTEGER, POINTER, DIMENSION(:,:) :: inml_mle 100 !!---------------------------------------------------------------------- 101 ! 102 IF( nn_timing == 1 ) CALL timing_start('tra_adv_mle') 103 CALL wrk_alloc( jpi, jpj, zpsim_u, zpsim_v, zmld, zbm, zhu, zhv, zn2, zLf_NH, zLf_MH) 104 CALL wrk_alloc( jpi, jpj, jpk, zpsi_uw, zpsi_vw) 105 CALL wrk_alloc( jpi, jpj, inml_mle) 88 INTEGER :: ji, jj, jk ! dummy loop indices 89 INTEGER :: ii, ij, ik, ikmax ! local integers 90 REAL(wp) :: zcuw, zmuw, zc ! local scalar 91 REAL(wp) :: zcvw, zmvw ! - - 92 INTEGER , DIMENSION(jpi,jpj) :: inml_mle 93 REAL(wp), DIMENSION(jpi,jpj) :: zpsim_u, zpsim_v, zmld, zbm, zhu, zhv, zn2, zLf_NH, zLf_MH 94 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpsi_uw, zpsi_vw 95 !!---------------------------------------------------------------------- 96 ! 97 IF( ln_timing ) CALL timing_start('tra_adv_mle') 106 98 ! 107 99 ! !== MLD used for MLE ==! … … 256 248 CALL iom_put( "psiv_mle", zpsi_vw ) ! j-mle streamfunction 257 249 ENDIF 258 CALL wrk_dealloc( jpi, jpj, zpsim_u, zpsim_v, zmld, zbm, zhu, zhv, zn2, zLf_NH, zLf_MH) 259 CALL wrk_dealloc( jpi, jpj, jpk, zpsi_uw, zpsi_vw) 260 CALL wrk_dealloc( jpi, jpj, inml_mle) 261 262 IF( nn_timing == 1 ) CALL timing_stop('tra_adv_mle') 250 ! 251 IF( ln_timing ) CALL timing_stop('tra_adv_mle') 263 252 ! 264 253 END SUBROUTINE tra_adv_mle -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_mus.F90
r7753 r8568 26 26 27 27 ! 28 USE iom 29 USE wrk_nemo ! Memory Allocation 28 USE iom ! XIOS library 30 29 USE timing ! Timing 31 30 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) … … 85 84 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 86 85 ! 87 INTEGER :: ji, jj, jk, jn ! dummy loop indices 88 INTEGER :: ierr ! local integer 89 REAL(wp) :: zu, z0u, zzwx, zw ! local scalars 90 REAL(wp) :: zv, z0v, zzwy, z0w ! - - 91 REAL(wp) :: zalpha ! - - 92 REAL(wp), POINTER, DIMENSION(:,:,:) :: zslpx, zslpy ! 3D workspace 93 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwx , zwy ! - - 86 INTEGER :: ji, jj, jk, jn ! dummy loop indices 87 INTEGER :: ierr ! local integer 88 REAL(wp) :: zu, z0u, zzwx, zw , zalpha ! local scalars 89 REAL(wp) :: zv, z0v, zzwy, z0w ! - - 90 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwx, zslpx ! 3D workspace 91 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwy, zslpy ! - - 94 92 !!---------------------------------------------------------------------- 95 93 ! 96 IF( nn_timing == 1 ) CALL timing_start('tra_adv_mus') 97 ! 98 CALL wrk_alloc( jpi,jpj,jpk, zslpx, zslpy, zwx, zwy ) 94 IF( ln_timing ) CALL timing_start('tra_adv_mus') 99 95 ! 100 96 IF( kt == kit000 ) THEN … … 279 275 END DO ! end of tracer loop 280 276 ! 281 CALL wrk_dealloc( jpi,jpj,jpk, zslpx, zslpy, zwx, zwy ) 282 ! 283 IF( nn_timing == 1 ) CALL timing_stop('tra_adv_mus') 277 IF( ln_timing ) CALL timing_stop('tra_adv_mus') 284 278 ! 285 279 END SUBROUTINE tra_adv_mus -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_qck.F90
r7646 r8568 25 25 USE lbclnk ! ocean lateral boundary condition (or mpp link) 26 26 USE in_out_manager ! I/O manager 27 USE wrk_nemo ! Memory Allocation28 27 USE timing ! Timing 29 28 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) … … 43 42 # include "vectopt_loop_substitute.h90" 44 43 !!---------------------------------------------------------------------- 45 !! NEMO/OPA 3.3 , NEMO Consortium (2010)44 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 46 45 !! $Id$ 47 46 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 96 95 !!---------------------------------------------------------------------- 97 96 ! 98 IF( nn_timing == 1 )CALL timing_start('tra_adv_qck')97 IF( ln_timing ) CALL timing_start('tra_adv_qck') 99 98 ! 100 99 IF( kt == kit000 ) THEN … … 118 117 CALL tra_adv_cen2_k( kt, cdtype, pwn, ptn, pta, kjpt ) 119 118 ! 120 IF( nn_timing == 1 )CALL timing_stop('tra_adv_qck')119 IF( ln_timing ) CALL timing_stop('tra_adv_qck') 121 120 ! 122 121 END SUBROUTINE tra_adv_qck … … 138 137 INTEGER :: ji, jj, jk, jn ! dummy loop indices 139 138 REAL(wp) :: ztra, zbtr, zdir, zdx, zmsk ! local scalars 140 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwx, zfu, zfc, zfd139 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwx, zfu, zfc, zfd 141 140 !---------------------------------------------------------------------- 142 141 ! 143 CALL wrk_alloc( jpi, jpj, jpk, zwx, zfu, zfc, zfd )144 142 ! ! =========== 145 143 DO jn = 1, kjpt ! tracer loop … … 230 228 END DO 231 229 ! ! trend diagnostics 232 IF( l_trd ) 230 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pun, ptn(:,:,:,jn) ) 233 231 ! 234 232 END DO 235 !236 CALL wrk_dealloc( jpi, jpj, jpk, zwx, zfu, zfc, zfd )237 233 ! 238 234 END SUBROUTINE tra_adv_qck_i … … 252 248 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 253 249 !! 254 INTEGER :: ji, jj, jk, jn ! dummy loop indices250 INTEGER :: ji, jj, jk, jn ! dummy loop indices 255 251 REAL(wp) :: ztra, zbtr, zdir, zdx, zmsk ! local scalars 256 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwy, zfu, zfc, zfd252 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwy, zfu, zfc, zfd ! 3D workspace 257 253 !---------------------------------------------------------------------- 258 !259 CALL wrk_alloc( jpi, jpj, jpk, zwy, zfu, zfc, zfd )260 254 ! 261 255 ! ! =========== … … 320 314 END DO 321 315 END DO 322 !--- Lateral boundary conditions 323 CALL lbc_lnk( zfu(:,:,:), 'T', 1. ) 316 CALL lbc_lnk( zfu(:,:,:), 'T', 1. ) !--- Lateral boundary conditions 324 317 ! 325 318 ! Tracer flux on the x-direction … … 359 352 END DO 360 353 ! 361 CALL wrk_dealloc( jpi, jpj, jpk, zwy, zfu, zfc, zfd )362 !363 354 END SUBROUTINE tra_adv_qck_j 364 355 … … 377 368 ! 378 369 INTEGER :: ji, jj, jk, jn ! dummy loop indices 379 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwz 380 !!---------------------------------------------------------------------- 381 ! 382 CALL wrk_alloc( jpi,jpj,jpk, zwz ) 370 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwz ! 3D workspace 371 !!---------------------------------------------------------------------- 383 372 ! 384 373 zwz(:,:, 1 ) = 0._wp ! surface & bottom values set to zero for all tracers … … 421 410 END DO 422 411 ! 423 CALL wrk_dealloc( jpi,jpj,jpk, zwz )424 !425 412 END SUBROUTINE tra_adv_cen2_k 426 413 … … 443 430 !---------------------------------------------------------------------- 444 431 ! 445 IF( nn_timing == 1 )CALL timing_start('quickest')432 IF( ln_timing ) CALL timing_start('quickest') 446 433 ! 447 434 DO jk = 1, jpkm1 … … 475 462 END DO 476 463 ! 477 IF( nn_timing == 1 )CALL timing_stop('quickest')464 IF( ln_timing ) CALL timing_stop('quickest') 478 465 ! 479 466 END SUBROUTINE quickest -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_ubs.F90
r7646 r8568 22 22 23 23 ! 24 USE iom 25 USE lib_mpp ! I/Olibrary24 USE iom ! XIOS library 25 USE lib_mpp ! massively parallel library 26 26 USE lbclnk ! ocean lateral boundary condition (or mpp link) 27 27 USE in_out_manager ! I/O manager 28 USE wrk_nemo ! Memory Allocation29 28 USE timing ! Timing 30 29 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) … … 101 100 REAL(wp) :: zfp_ui, zfm_ui, zcenut, ztak, zfp_wk, zfm_wk ! - - 102 101 REAL(wp) :: zfp_vj, zfm_vj, zcenvt, zeeu, zeev, z_hdivn ! - - 103 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztu, ztv, zltu, zltv, zti, ztw 104 !!---------------------------------------------------------------------- 105 ! 106 IF( nn_timing == 1 ) CALL timing_start('tra_adv_ubs') 107 ! 108 CALL wrk_alloc( jpi,jpj,jpk, ztu, ztv, zltu, zltv, zti, ztw ) 102 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztu, ztv, zltu, zltv, zti, ztw ! 3D workspace 103 !!---------------------------------------------------------------------- 104 ! 105 IF( ln_timing ) CALL timing_start('tra_adv_ubs') 109 106 ! 110 107 IF( kt == kit000 ) THEN … … 285 282 END DO 286 283 ! 287 CALL wrk_dealloc( jpi,jpj,jpk, ztu, ztv, zltu, zltv, zti, ztw ) 288 ! 289 IF( nn_timing == 1 ) CALL timing_stop('tra_adv_ubs') 284 IF( ln_timing ) CALL timing_stop('tra_adv_ubs') 290 285 ! 291 286 END SUBROUTINE tra_adv_ubs … … 313 308 INTEGER :: ikm1 ! local integer 314 309 REAL(wp) :: zpos, zneg, zbt, za, zb, zc, zbig, zrtrn ! local scalars 315 REAL(wp), POINTER, DIMENSION(:,:,:) :: zbetup, zbetdo 316 !!---------------------------------------------------------------------- 317 ! 318 IF( nn_timing == 1 ) CALL timing_start('nonosc_z') 319 ! 320 CALL wrk_alloc( jpi,jpj,jpk, zbetup, zbetdo ) 310 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zbetup, zbetdo ! 3D workspace 311 !!---------------------------------------------------------------------- 312 ! 313 IF( ln_timing ) CALL timing_start('nonosc_z') 321 314 ! 322 315 zbig = 1.e+40_wp … … 387 380 END DO 388 381 ! 389 CALL wrk_dealloc( jpi,jpj,jpk, zbetup, zbetdo ) 390 ! 391 IF( nn_timing == 1 ) CALL timing_stop('nonosc_z') 382 IF( ln_timing ) CALL timing_stop('nonosc_z') 392 383 ! 393 384 END SUBROUTINE nonosc_z -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/trabbc.F90
r7753 r8568 27 27 USE lib_mpp ! distributed memory computing library 28 28 USE prtctl ! Print control 29 USE wrk_nemo ! Memory Allocation30 29 USE timing ! Timing 31 30 … … 77 76 ! 78 77 INTEGER :: ji, jj ! dummy loop indices 79 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdt78 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdt ! 3D workspace 80 79 !!---------------------------------------------------------------------- 81 80 ! 82 IF( nn_timing == 1 )CALL timing_start('tra_bbc')81 IF( ln_timing ) CALL timing_start('tra_bbc') 83 82 ! 84 83 IF( l_trdtra ) THEN ! Save the input temperature trend 85 CALL wrk_alloc( jpi,jpj,jpk, ztrdt)84 ALLOCATE( ztrdt(jpi,jpj,jpk) ) 86 85 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 87 86 ENDIF … … 98 97 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:) 99 98 CALL trd_tra( kt, 'TRA', jp_tem, jptra_bbc, ztrdt ) 100 CALL wrk_dealloc( jpi,jpj,jpk,ztrdt )99 DEALLOCATE( ztrdt ) 101 100 ENDIF 102 101 ! 103 102 IF(ln_ctl) CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' bbc - Ta: ', mask1=tmask, clinfo3='tra-ta' ) 104 103 ! 105 IF( nn_timing == 1 )CALL timing_stop('tra_bbc')104 IF( ln_timing ) CALL timing_stop('tra_bbc') 106 105 ! 107 106 END SUBROUTINE tra_bbc … … 130 129 TYPE(FLD_N) :: sn_qgh ! informations about the geotherm. field to be read 131 130 CHARACTER(len=256) :: cn_dir ! Root directory for location of ssr files 132 ! 131 !! 133 132 NAMELIST/nambbc/ln_trabbc, nn_geoflx, rn_geoflx_cst, sn_qgh, cn_dir 134 133 !!---------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/trabbl.F90
r8215 r8568 35 35 USE lbclnk ! ocean lateral boundary conditions 36 36 USE prtctl ! Print control 37 USE wrk_nemo ! Memory Allocation38 37 USE timing ! Timing 39 38 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) … … 104 103 INTEGER, INTENT( in ) :: kt ! ocean time-step 105 104 ! 106 REAL(wp), POINTER, DIMENSION(:,:,:) ::ztrdt, ztrds107 !!---------------------------------------------------------------------- 108 ! 109 IF( nn_timing == 1 )CALL timing_start( 'tra_bbl')105 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdt, ztrds 106 !!---------------------------------------------------------------------- 107 ! 108 IF( ln_timing ) CALL timing_start( 'tra_bbl') 110 109 ! 111 110 IF( l_trdtra ) THEN !* Save the T-S input trends 112 CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds)111 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 113 112 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 114 113 ztrds(:,:,:) = tsa(:,:,:,jp_sal) … … 148 147 CALL trd_tra( kt, 'TRA', jp_tem, jptra_bbl, ztrdt ) 149 148 CALL trd_tra( kt, 'TRA', jp_sal, jptra_bbl, ztrds ) 150 CALL wrk_dealloc( jpi, jpj, jpk,ztrdt, ztrds )151 ENDIF 152 ! 153 IF( nn_timing == 1) CALL timing_stop( 'tra_bbl')149 DEALLOCATE( ztrdt, ztrds ) 150 ENDIF 151 ! 152 IF( ln_timing ) CALL timing_stop( 'tra_bbl') 154 153 ! 155 154 END SUBROUTINE tra_bbl … … 184 183 INTEGER :: ik ! local integers 185 184 REAL(wp) :: zbtr ! local scalars 186 REAL(wp), POINTER, DIMENSION(:,:) :: zptb 187 !!---------------------------------------------------------------------- 188 ! 189 IF( nn_timing == 1 ) CALL timing_start('tra_bbl_dif') 190 ! 191 CALL wrk_alloc( jpi, jpj, zptb ) 185 REAL(wp), DIMENSION(jpi,jpj) :: zptb ! workspace 186 !!---------------------------------------------------------------------- 187 ! 188 IF( ln_timing ) CALL timing_start('tra_bbl_dif') 192 189 ! 193 190 DO jn = 1, kjpt ! tracer loop … … 214 211 END DO ! end tracer 215 212 ! ! =========== 216 CALL wrk_dealloc( jpi, jpj, zptb ) 217 ! 218 IF( nn_timing == 1 ) CALL timing_stop('tra_bbl_dif') 213 ! 214 IF( ln_timing ) CALL timing_stop('tra_bbl_dif') 219 215 ! 220 216 END SUBROUTINE tra_bbl_dif … … 247 243 !!---------------------------------------------------------------------- 248 244 ! 249 IF( nn_timing == 1 )CALL timing_start( 'tra_bbl_adv')245 IF( ln_timing ) CALL timing_start( 'tra_bbl_adv') 250 246 ! ! =========== 251 247 DO jn = 1, kjpt ! tracer loop … … 303 299 ! ! =========== 304 300 ! 305 IF( nn_timing == 1 )CALL timing_stop( 'tra_bbl_adv')301 IF( ln_timing ) CALL timing_stop( 'tra_bbl_adv') 306 302 ! 307 303 END SUBROUTINE tra_bbl_adv … … 348 344 !!---------------------------------------------------------------------- 349 345 ! 350 IF( nn_timing == 1 )CALL timing_start( 'bbl')346 IF( ln_timing ) CALL timing_start( 'bbl') 351 347 ! 352 348 IF( kt == kit000 ) THEN … … 479 475 ENDIF 480 476 ! 481 IF( nn_timing == 1 )CALL timing_stop( 'bbl')477 IF( ln_timing ) CALL timing_stop( 'bbl') 482 478 ! 483 479 END SUBROUTINE bbl … … 493 489 !! called by nemo_init at the first timestep (kit000) 494 490 !!---------------------------------------------------------------------- 495 INTEGER :: ji, jj ! dummy loop indices 496 INTEGER :: ii0, ii1, ij0, ij1 ! local integer 497 INTEGER :: ios ! - - 498 REAL(wp), POINTER, DIMENSION(:,:) :: zmbk 491 INTEGER :: ji, jj ! dummy loop indices 492 INTEGER :: ii0, ii1, ij0, ij1, ios ! local integer 493 REAL(wp), DIMENSION(jpi,jpj) :: zmbk ! workspace 499 494 !! 500 495 NAMELIST/nambbl/ ln_trabbl, nn_bbl_ldf, nn_bbl_adv, rn_ahtbbl, rn_gambbl 501 496 !!---------------------------------------------------------------------- 502 497 ! 503 IF( nn_timing == 1 )CALL timing_start( 'tra_bbl_init')498 IF( ln_timing ) CALL timing_start( 'tra_bbl_init') 504 499 ! 505 500 REWIND( numnam_ref ) ! Namelist nambbl in reference namelist : Bottom boundary layer scheme … … 544 539 END DO 545 540 ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk 546 CALL wrk_alloc( jpi, jpj, zmbk )547 541 zmbk(:,:) = REAL( mbku_d(:,:), wp ) ; CALL lbc_lnk(zmbk,'U',1.) ; mbku_d(:,:) = MAX( INT( zmbk(:,:) ), 1 ) 548 542 zmbk(:,:) = REAL( mbkv_d(:,:), wp ) ; CALL lbc_lnk(zmbk,'V',1.) ; mbkv_d(:,:) = MAX( INT( zmbk(:,:) ), 1 ) 549 CALL wrk_dealloc( jpi, jpj, zmbk )550 543 ! 551 544 ! !* sign of grad(H) at u- and v-points … … 570 563 ahv_bbl_0(:,:) = rn_ahtbbl * e1_e2v(:,:) * e3v_bbl_0(:,:) * vmask(:,:,1) 571 564 ! 572 IF( nn_timing == 1 )CALL timing_stop( 'tra_bbl_init')565 IF( ln_timing ) CALL timing_stop( 'tra_bbl_init') 573 566 ! 574 567 END SUBROUTINE tra_bbl_init -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/tradmp.F90
r7753 r8568 33 33 ! 34 34 USE in_out_manager ! I/O manager 35 USE iom ! XIOS 35 36 USE lib_mpp ! MPP library 36 37 USE prtctl ! Print control 37 USE wrk_nemo ! Memory allocation38 38 USE timing ! Timing 39 USE iom40 39 41 40 IMPLICIT NONE … … 94 93 ! 95 94 INTEGER :: ji, jj, jk, jn ! dummy loop indices 96 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: zts_dta, ztrdts97 !!----------------------------------------------------------------------98 ! 99 IF( nn_timing == 1 ) CALL timing_start('tra_dmp')100 !101 CALL wrk_alloc( jpi,jpj,jpk,jpts, zts_dta )95 REAL(wp), DIMENSION(jpi,jpj,jpk,jpts) :: zts_dta 96 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: ztrdts 97 !!---------------------------------------------------------------------- 98 ! 99 IF( ln_timing ) CALL timing_start('tra_dmp') 100 ! 102 101 IF( l_trdtra ) THEN !* Save ta and sa trends 103 CALL wrk_alloc( jpi,jpj,jpk,jpts, ztrdts)102 ALLOCATE( ztrdts(jpi,jpj,jpk,jpts) ) 104 103 ztrdts(:,:,:,:) = tsa(:,:,:,:) 105 104 ENDIF … … 154 153 CALL trd_tra( kt, 'TRA', jp_tem, jptra_dmp, ztrdts(:,:,:,jp_tem) ) 155 154 CALL trd_tra( kt, 'TRA', jp_sal, jptra_dmp, ztrdts(:,:,:,jp_sal) ) 156 CALL wrk_dealloc( jpi,jpj,jpk,jpts,ztrdts )155 DEALLOCATE( ztrdts ) 157 156 ENDIF 158 157 ! ! Control print … … 160 159 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 161 160 ! 162 CALL wrk_dealloc( jpi,jpj,jpk,jpts, zts_dta ) 163 ! 164 IF( nn_timing == 1 ) CALL timing_stop('tra_dmp') 161 IF( ln_timing ) CALL timing_stop('tra_dmp') 165 162 ! 166 163 END SUBROUTINE tra_dmp -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/traldf.F90
r7765 r8568 30 30 USE lib_mpp ! distribued memory computing library 31 31 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 32 USE wrk_nemo ! Memory allocation33 32 USE timing ! Timing 34 33 … … 58 57 INTEGER, INTENT( in ) :: kt ! ocean time-step index 59 58 !! 60 REAL(wp), POINTER, DIMENSION(:,:,:) ::ztrdt, ztrds61 !!---------------------------------------------------------------------- 62 ! 63 IF( nn_timing == 1) CALL timing_start('tra_ldf')59 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdt, ztrds 60 !!---------------------------------------------------------------------- 61 ! 62 IF( ln_timing ) CALL timing_start('tra_ldf') 64 63 ! 65 64 IF( l_trdtra ) THEN !* Save ta and sa trends 66 CALL wrk_alloc( jpi,jpj,jpk, ztrdt, ztrds)65 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 67 66 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 68 67 ztrds(:,:,:) = tsa(:,:,:,jp_sal) … … 85 84 CALL trd_tra( kt, 'TRA', jp_tem, jptra_ldf, ztrdt ) 86 85 CALL trd_tra( kt, 'TRA', jp_sal, jptra_ldf, ztrds ) 87 CALL wrk_dealloc( jpi,jpj,jpk,ztrdt, ztrds )86 DEALLOCATE( ztrdt, ztrds ) 88 87 ENDIF 89 88 ! !* print mean trends (used for debugging) … … 91 90 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 92 91 ! 93 IF( nn_timing == 1) CALL timing_stop('tra_ldf')92 IF( ln_timing ) CALL timing_stop('tra_ldf') 94 93 ! 95 94 END SUBROUTINE tra_ldf … … 107 106 !!---------------------------------------------------------------------- 108 107 ! 109 IF(lwp) THEN ! Namelist print108 IF(lwp) THEN !== Namelist print ==! 110 109 WRITE(numout,*) 111 110 WRITE(numout,*) 'tra_ldf_init : lateral tracer diffusive operator' … … 114 113 WRITE(numout,*) ' see ldf_tra_init report for lateral mixing parameters' 115 114 ENDIF 116 ! ! use of lateral operator or not115 ! !== use of lateral operator or not ==! 117 116 nldf = np_ERROR 118 117 ioptio = 0 119 IF( ln_traldf_ lap ) ioptio = ioptio + 1120 IF( ln_traldf_ blp ) ioptio = ioptio + 1121 IF( ioptio > 1 ) CALL ctl_stop( 'tra_ldf_init: use ONE or NONE of the 2 lap/bilap operator type on tracer' )122 IF( ioptio == 0 ) nldf = np_no_ldf ! No lateral diffusion123 ! 124 IF( nldf /= np_no_ldf ) THEN ! direction ==>> type of operator118 IF( ln_traldf_NONE ) THEN ; nldf = np_no_ldf ; ioptio = ioptio + 1 ; ENDIF 119 IF( ln_traldf_lap ) THEN ; ioptio = ioptio + 1 ; ENDIF 120 IF( ln_traldf_blp ) THEN ; ioptio = ioptio + 1 ; ENDIF 121 IF( ioptio /= 1 ) CALL ctl_stop( 'tra_ldf_init: use ONE of the 3 operator options (NONE/lap/blp)' ) 122 ! 123 IF( .NOT.ln_traldf_NONE ) THEN !== direction ==>> type of operator ==! 125 124 ioptio = 0 126 125 IF( ln_traldf_lev ) ioptio = ioptio + 1 127 126 IF( ln_traldf_hor ) ioptio = ioptio + 1 128 127 IF( ln_traldf_iso ) ioptio = ioptio + 1 129 IF( ioptio > 1 ) CALL ctl_stop( 'tra_ldf_init: use onlyONE direction (level/hor/iso)' )128 IF( ioptio /= 1 ) CALL ctl_stop( 'tra_ldf_init: use ONE direction (level/hor/iso)' ) 130 129 ! 131 130 ! ! defined the type of lateral diffusion from ln_traldf_... logicals -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_iso.F90
r7753 r8568 30 30 USE phycst ! physical constants 31 31 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 32 USE wrk_nemo ! Memory Allocation33 32 USE timing ! Timing 34 33 … … 111 110 REAL(wp) :: zmskv, zahv_w, zabe2, zcof2, zcoef4 ! - - 112 111 REAL(wp) :: zcoef0, ze3w_2, zsign, z2dt, z1_2dt ! - - 113 REAL(wp), POINTER, DIMENSION(:,:) :: zdkt, zdk1t, z2d 114 REAL(wp), POINTER, DIMENSION(:,:,:) :: zdit, zdjt, zftu, zftv, ztfw 115 !!---------------------------------------------------------------------- 116 ! 117 IF( nn_timing == 1 ) CALL timing_start('tra_ldf_iso') 118 ! 119 CALL wrk_alloc( jpi,jpj, zdkt, zdk1t, z2d ) 120 CALL wrk_alloc( jpi,jpj,jpk, zdit, zdjt , zftu, zftv, ztfw ) 112 REAL(wp), DIMENSION(jpi,jpj) :: zdkt, zdk1t, z2d 113 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdit, zdjt, zftu, zftv, ztfw 114 !!---------------------------------------------------------------------- 115 ! 116 IF( ln_timing ) CALL timing_start('tra_ldf_iso') 121 117 ! 122 118 IF( kt == kit000 ) THEN … … 386 382 ! ! =============== 387 383 END DO ! end tracer loop 388 ! ! =============== 389 ! 390 CALL wrk_dealloc( jpi, jpj, zdkt, zdk1t, z2d ) 391 CALL wrk_dealloc( jpi, jpj, jpk, zdit, zdjt , zftu, zftv, ztfw ) 392 ! 393 IF( nn_timing == 1 ) CALL timing_stop('tra_ldf_iso') 384 ! 385 IF( ln_timing ) CALL timing_stop('tra_ldf_iso') 394 386 ! 395 387 END SUBROUTINE tra_ldf_iso -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_lap_blp.F90
r7646 r8568 22 22 ! 23 23 USE in_out_manager ! I/O manager 24 USE iom ! I/O library 24 25 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 25 26 USE lib_mpp ! distribued memory computing library 26 27 USE timing ! Timing 27 USE wrk_nemo ! Memory allocation28 USE iom29 28 30 29 IMPLICIT NONE … … 87 86 INTEGER :: ji, jj, jk, jn ! dummy loop indices 88 87 REAL(wp) :: zsign ! local scalars 89 REAL(wp), POINTER, DIMENSION(:,:,:) ::ztu, ztv, zaheeu, zaheev90 !!---------------------------------------------------------------------- 91 ! 92 IF( nn_timing == 1) CALL timing_start('tra_ldf_lap')88 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztu, ztv, zaheeu, zaheev 89 !!---------------------------------------------------------------------- 90 ! 91 IF( ln_timing ) CALL timing_start('tra_ldf_lap') 93 92 ! 94 93 IF( kt == nit000 .AND. lwp ) THEN … … 97 96 WRITE(numout,*) '~~~~~~~~~~~ ' 98 97 ENDIF 99 !100 CALL wrk_alloc( jpi,jpj,jpk, ztu, ztv, zaheeu, zaheev )101 98 ! 102 99 l_hst = .FALSE. … … 169 166 ! ! ================== 170 167 ! 171 CALL wrk_dealloc( jpi,jpj,jpk, ztu, ztv, zaheeu, zaheev ) 172 ! 173 IF( nn_timing == 1 ) CALL timing_stop('tra_ldf_lap') 168 IF( ln_timing ) CALL timing_stop('tra_ldf_lap') 174 169 ! 175 170 END SUBROUTINE tra_ldf_lap … … 203 198 ! 204 199 INTEGER :: ji, jj, jk, jn ! dummy loop indices 205 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: zlap ! laplacian at t-point206 REAL(wp), POINTER, DIMENSION(:,:,:):: zglu, zglv ! bottom GRADh of the laplacian (u- and v-points)207 REAL(wp), POINTER, DIMENSION(:,:,:):: zgui, zgvi ! top GRADh of the laplacian (u- and v-points)200 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt) :: zlap ! laplacian at t-point 201 REAL(wp), DIMENSION(jpi,jpj, kjpt) :: zglu, zglv ! bottom GRADh of the laplacian (u- and v-points) 202 REAL(wp), DIMENSION(jpi,jpj, kjpt) :: zgui, zgvi ! top GRADh of the laplacian (u- and v-points) 208 203 !!--------------------------------------------------------------------- 209 204 ! 210 IF( nn_timing == 1 ) CALL timing_start('tra_ldf_blp') 211 ! 212 CALL wrk_alloc( jpi,jpj,jpk,kjpt, zlap ) 213 CALL wrk_alloc( jpi,jpj, kjpt, zglu, zglv, zgui, zgvi ) 205 IF( ln_timing ) CALL timing_start('tra_ldf_blp') 214 206 ! 215 207 IF( kt == kit000 .AND. lwp ) THEN … … 253 245 END SELECT 254 246 ! 255 CALL wrk_dealloc( jpi,jpj,jpk,kjpt, zlap ) 256 CALL wrk_dealloc( jpi,jpj ,kjpt, zglu, zglv, zgui, zgvi ) 257 ! 258 IF( nn_timing == 1 ) CALL timing_stop('tra_ldf_blp') 247 IF( ln_timing ) CALL timing_stop('tra_ldf_blp') 259 248 ! 260 249 END SUBROUTINE tra_ldf_blp -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_triad.F90
r7646 r8568 27 27 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 28 28 USE lib_mpp ! MPP library 29 USE wrk_nemo ! Memory Allocation30 29 USE timing ! Timing 31 30 … … 94 93 REAL(wp) :: ze1ur, ze2vr, ze3wr, zdxt, zdyt, zdzt 95 94 REAL(wp) :: zah, zah_slp, zaei_slp 96 REAL(wp), POINTER, DIMENSION(:,: ) :: z2d! 2D workspace97 REAL(wp), POINTER, DIMENSION(:,:,:) ::zdit, zdjt, zftu, zftv, ztfw, zpsi_uw, zpsi_vw ! 3D -95 REAL(wp), DIMENSION(jpi,jpj ) :: z2d ! 2D workspace 96 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdit, zdjt, zftu, zftv, ztfw, zpsi_uw, zpsi_vw ! 3D - 98 97 !!---------------------------------------------------------------------- 99 98 ! 100 IF( nn_timing == 1 ) CALL timing_start('tra_ldf_triad') 101 ! 102 CALL wrk_alloc( jpi,jpj, z2d ) 103 CALL wrk_alloc( jpi,jpj,jpk, zdit, zdjt, zftu, zftv, ztfw, zpsi_uw, zpsi_vw ) 99 IF( ln_timing ) CALL timing_start('tra_ldf_triad') 104 100 ! 105 101 IF( .NOT.ALLOCATED(zdkt3d) ) THEN … … 434 430 END DO ! end tracer loop 435 431 ! ! =============== 436 ! 437 CALL wrk_dealloc( jpi,jpj, z2d ) 438 CALL wrk_dealloc( jpi,jpj,jpk, zdit, zdjt, zftu, zftv, ztfw, zpsi_uw, zpsi_vw ) 439 ! 440 IF( nn_timing == 1 ) CALL timing_stop('tra_ldf_triad') 432 IF( ln_timing ) CALL timing_stop('tra_ldf_triad') 441 433 ! 442 434 END SUBROUTINE tra_ldf_triad -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/tranpc.F90
r6140 r8568 26 26 USE in_out_manager ! I/O manager 27 27 USE lib_mpp ! MPP library 28 USE wrk_nemo ! Memory Allocation29 28 USE timing ! Timing 30 29 … … 67 66 REAL(wp) :: zta, zalfa, zsum_temp, zsum_alfa, zaw, zdz, zsum_z 68 67 REAL(wp) :: zsa, zbeta, zsum_sali, zsum_beta, zbw, zrw, z1_r2dt 69 REAL(wp), PARAMETER :: zn2_zero = 1.e-14_wp ! acceptance criteria for neutrality (N2==0) 70 REAL(wp), POINTER, DIMENSION(:) :: zvn2 ! vertical profile of N2 at 1 given point... 71 REAL(wp), POINTER, DIMENSION(:,:) :: zvts ! vertical profile of T and S at 1 given point... 72 REAL(wp), POINTER, DIMENSION(:,:) :: zvab ! vertical profile of alpha and beta 73 REAL(wp), POINTER, DIMENSION(:,:,:) :: zn2 ! N^2 74 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: zab ! alpha and beta 75 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdt, ztrds ! 3D workspace 68 REAL(wp), PARAMETER :: zn2_zero = 1.e-14_wp ! acceptance criteria for neutrality (N2==0) 69 REAL(wp), DIMENSION( jpk ) :: zvn2 ! vertical profile of N2 at 1 given point... 70 REAL(wp), DIMENSION( jpk,jpts) :: zvts, zvab ! vertical profile of T & S , and alpha & betaat 1 given point 71 REAL(wp), DIMENSION(jpi,jpj,jpk ) :: zn2 ! N^2 72 REAL(wp), DIMENSION(jpi,jpj,jpk,jpts) :: zab ! alpha and beta 73 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdt, ztrds ! 3D workspace 76 74 ! 77 75 LOGICAL, PARAMETER :: l_LB_debug = .FALSE. ! set to true if you want to follow what is … … 80 78 !!---------------------------------------------------------------------- 81 79 ! 82 IF( nn_timing == 1 )CALL timing_start('tra_npc')80 IF( ln_timing ) CALL timing_start('tra_npc') 83 81 ! 84 82 IF( MOD( kt, nn_npc ) == 0 ) THEN 85 83 ! 86 CALL wrk_alloc( jpi, jpj, jpk, zn2 ) ! N287 CALL wrk_alloc( jpi, jpj, jpk, 2, zab ) ! Alpha and Beta88 CALL wrk_alloc( jpk, 2, zvts, zvab ) ! 1D column vector at point ji,jj89 CALL wrk_alloc( jpk, zvn2 ) ! 1D column vector at point ji,jj90 91 84 IF( l_trdtra ) THEN !* Save initial after fields 92 CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds)85 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 93 86 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 94 87 ztrds(:,:,:) = tsa(:,:,:,jp_sal) 95 88 ENDIF 96 89 ! 97 90 IF( l_LB_debug ) THEN 98 91 ! Location of 1 known convection site to follow what's happening in the water column … … 101 94 klc1 = mbkt(ilc1,jlc1) ! bottom of the ocean for debug point... 102 95 ENDIF 103 96 ! 104 97 CALL eos_rab( tsa, zab ) ! after alpha and beta (given on T-points) 105 98 CALL bn2 ( tsa, zab, zn2 ) ! after Brunt-Vaisala (given on W-points) 106 99 ! 107 100 inpcc = 0 108 101 ! 109 102 DO jj = 2, jpjm1 ! interior column only 110 103 DO ji = fs_2, fs_jpim1 … … 313 306 CALL trd_tra( kt, 'TRA', jp_tem, jptra_npc, ztrdt ) 314 307 CALL trd_tra( kt, 'TRA', jp_sal, jptra_npc, ztrds ) 315 CALL wrk_dealloc( jpi, jpj, jpk,ztrdt, ztrds )308 DEALLOCATE( ztrdt, ztrds ) 316 309 ENDIF 317 310 ! … … 323 316 ENDIF 324 317 ! 325 CALL wrk_dealloc(jpi, jpj, jpk, zn2 )326 CALL wrk_dealloc(jpi, jpj, jpk, 2, zab )327 CALL wrk_dealloc(jpk, zvn2 )328 CALL wrk_dealloc(jpk, 2, zvts, zvab )329 !330 318 ENDIF ! IF( MOD( kt, nn_npc ) == 0 ) THEN 331 319 ! 332 IF( nn_timing == 1 )CALL timing_stop('tra_npc')320 IF( ln_timing ) CALL timing_stop('tra_npc') 333 321 ! 334 322 END SUBROUTINE tra_npc -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/tranxt.F90
r7753 r8568 35 35 USE traqsr ! penetrative solar radiation (needed for nksr) 36 36 USE phycst ! physical constant 37 USE ldftra ! lateral physics ontracers38 USE ldfslp 39 USE bdy_oce , ONLY: ln_bdy37 USE ldftra ! lateral physics : tracers 38 USE ldfslp ! lateral physics : slopes 39 USE bdy_oce , ONLY : ln_bdy 40 40 USE bdytra ! open boundary condition (bdy_tra routine) 41 41 ! … … 43 43 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 44 44 USE prtctl ! Print control 45 USE wrk_nemo ! Memory allocation46 45 USE timing ! Timing 47 46 #if defined key_agrif … … 91 90 INTEGER :: ji, jj, jk, jn ! dummy loop indices 92 91 REAL(wp) :: zfact ! local scalars 93 REAL(wp), POINTER, DIMENSION(:,:,:) ::ztrdt, ztrds94 !!---------------------------------------------------------------------- 95 ! 96 IF( nn_timing == 1 )CALL timing_start( 'tra_nxt')92 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdt, ztrds 93 !!---------------------------------------------------------------------- 94 ! 95 IF( ln_timing ) CALL timing_start( 'tra_nxt') 97 96 ! 98 97 IF( kt == nit000 ) THEN … … 120 119 ! trends computation initialisation 121 120 IF( l_trdtra ) THEN 122 CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds)121 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 123 122 ztrdt(:,:,jk) = 0._wp 124 123 ztrds(:,:,jk) = 0._wp … … 170 169 CALL trd_tra( kt, 'TRA', jp_tem, jptra_atf, ztrdt ) 171 170 CALL trd_tra( kt, 'TRA', jp_sal, jptra_atf, ztrds ) 172 CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds )171 DEALLOCATE( ztrdt , ztrds ) 173 172 END IF 174 173 ! … … 177 176 & tab3d_2=tsn(:,:,:,jp_sal), clinfo2= ' Sn: ', mask2=tmask ) 178 177 ! 179 IF( nn_timing == 1) CALL timing_stop('tra_nxt')178 IF( ln_timing ) CALL timing_stop('tra_nxt') 180 179 ! 181 180 END SUBROUTINE tra_nxt -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/traqsr.F90
r7753 r8568 29 29 USE in_out_manager ! I/O manager 30 30 USE prtctl ! Print control 31 USE iom ! I/O manager31 USE iom ! I/O library 32 32 USE fldread ! read input fields 33 33 USE restart ! ocean restart 34 34 USE lib_mpp ! MPP library 35 35 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 36 USE wrk_nemo ! Memory Allocation37 36 USE timing ! Timing 38 37 … … 113 112 REAL(wp) :: zCb, zCmax, zze, zpsi, zpsimax, zdelpsi, zCtot, zCze 114 113 REAL(wp) :: zlogc, zlogc2, zlogc3 115 REAL(wp), POINTER, DIMENSION(:,:) :: zekb, zekg, zekr116 REAL(wp), POINTER, DIMENSION(:,:,:) :: ze0, ze1, ze2, ze3, zea, ztrdt117 REAL(wp), POINTER, DIMENSION(:,:,:) :: zetot, zchl3d118 !!---------------------------------------------------------------------- 119 ! 120 IF( nn_timing == 1 )CALL timing_start('tra_qsr')114 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zekb, zekg, zekr 115 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ze0, ze1, ze2, ze3, zea, ztrdt 116 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zetot, zchl3d 117 !!---------------------------------------------------------------------- 118 ! 119 IF( ln_timing ) CALL timing_start('tra_qsr') 121 120 ! 122 121 IF( kt == nit000 ) THEN … … 127 126 ! 128 127 IF( l_trdtra ) THEN ! trends diagnostic: save the input temperature trend 129 CALL wrk_alloc( jpi,jpj,jpk, ztrdt)128 ALLOCATE( ztrdt(jpi,jpj,jpk) ) 130 129 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 131 130 ENDIF … … 161 160 CASE( np_RGB , np_RGBc ) !== R-G-B fluxes ==! 162 161 ! 163 CALL wrk_alloc( jpi,jpj, zekb, zekg, zekr ) 164 CALL wrk_alloc( jpi,jpj,jpk, ze0, ze1, ze2, ze3, zea, zchl3d ) 162 ALLOCATE( zekb(jpi,jpj) , zekg(jpi,jpj) , zekr (jpi,jpj) , & 163 & ze0 (jpi,jpj,jpk) , ze1 (jpi,jpj,jpk) , ze2 (jpi,jpj,jpk) , & 164 & ze3 (jpi,jpj,jpk) , zea (jpi,jpj,jpk) , zchl3d(jpi,jpj,jpk) ) 165 165 ! 166 166 IF( nqsr == np_RGBc ) THEN !* Variable Chlorophyll … … 240 240 END DO 241 241 ! 242 CALL wrk_dealloc( jpi,jpj, zekb, zekg, zekr ) 243 CALL wrk_dealloc( jpi,jpj,jpk, ze0, ze1, ze2, ze3, zea, zchl3d ) 242 DEALLOCATE( zekb , zekg , zekr , ze0 , ze1 , ze2 , ze3 , zea , zchl3d ) 244 243 ! 245 244 CASE( np_2BD ) !== 2-bands fluxes ==! … … 282 281 ! 283 282 IF( iom_use('qsr3d') ) THEN ! output the shortwave Radiation distribution 284 CALL wrk_alloc( jpi,jpj,jpk, zetot ) 285 ! 283 ALLOCATE( zetot(jpi,jpj,jpk) ) 286 284 zetot(:,:,nksr+1:jpk) = 0._wp ! below ~400m set to zero 287 285 DO jk = nksr, 1, -1 288 zetot(:,:,jk) = zetot(:,:,jk+1) + qsr_hc(:,:,jk) / r1_rau0_rcp286 zetot(:,:,jk) = zetot(:,:,jk+1) + qsr_hc(:,:,jk) * rau0_rcp 289 287 END DO 290 288 CALL iom_put( 'qsr3d', zetot ) ! 3D distribution of shortwave Radiation 291 ! 292 CALL wrk_dealloc( jpi,jpj,jpk, zetot ) 289 DEALLOCATE( zetot ) 293 290 ENDIF 294 291 ! … … 301 298 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:) 302 299 CALL trd_tra( kt, 'TRA', jp_tem, jptra_qsr, ztrdt ) 303 CALL wrk_dealloc( jpi,jpj,jpk,ztrdt )300 DEALLOCATE( ztrdt ) 304 301 ENDIF 305 302 ! ! print mean trends (used for debugging) 306 303 IF(ln_ctl) CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' qsr - Ta: ', mask1=tmask, clinfo3='tra-ta' ) 307 304 ! 308 IF( nn_timing == 1 )CALL timing_stop('tra_qsr')305 IF( ln_timing ) CALL timing_stop('tra_qsr') 309 306 ! 310 307 END SUBROUTINE tra_qsr … … 340 337 !!---------------------------------------------------------------------- 341 338 ! 342 IF( nn_timing == 1) CALL timing_start('tra_qsr_init')339 IF( ln_timing ) CALL timing_start('tra_qsr_init') 343 340 ! 344 341 REWIND( numnam_ref ) ! Namelist namtra_qsr in reference namelist … … 435 432 ENDIF 436 433 ! 437 IF( nn_timing == 1) CALL timing_stop('tra_qsr_init')434 IF( ln_timing ) CALL timing_stop('tra_qsr_init') 438 435 ! 439 436 END SUBROUTINE tra_qsr_init -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/trasbc.F90
r7788 r8568 32 32 USE iom ! xIOS server 33 33 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 34 USE wrk_nemo ! Memory Allocation35 34 USE timing ! Timing 36 35 … … 75 74 INTEGER :: ikt, ikb ! local integers 76 75 REAL(wp) :: zfact, z1_e3t, zdep ! local scalar 77 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdt, ztrds76 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdt, ztrds 78 77 !!---------------------------------------------------------------------- 79 78 ! 80 IF( nn_timing == 1 )CALL timing_start('tra_sbc')79 IF( ln_timing ) CALL timing_start('tra_sbc') 81 80 ! 82 81 IF( kt == nit000 ) THEN … … 87 86 ! 88 87 IF( l_trdtra ) THEN !* Save ta and sa trends 89 CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds)88 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 90 89 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 91 90 ztrds(:,:,:) = tsa(:,:,:,jp_sal) … … 232 231 CALL trd_tra( kt, 'TRA', jp_tem, jptra_nsr, ztrdt ) 233 232 CALL trd_tra( kt, 'TRA', jp_sal, jptra_nsr, ztrds ) 234 CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds )233 DEALLOCATE( ztrdt , ztrds ) 235 234 ENDIF 236 235 ! … … 238 237 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 239 238 ! 240 IF( nn_timing == 1 )CALL timing_stop('tra_sbc')239 IF( ln_timing ) CALL timing_stop('tra_sbc') 241 240 ! 242 241 END SUBROUTINE tra_sbc -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf.F90
r8215 r8568 56 56 !!--------------------------------------------------------------------- 57 57 ! 58 IF( nn_timing == 1 )CALL timing_start('tra_zdf')58 IF( ln_timing ) CALL timing_start('tra_zdf') 59 59 ! 60 60 IF( neuler == 0 .AND. kt == nit000 ) THEN ! at nit000 … … 97 97 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 98 98 ! 99 IF( nn_timing == 1 )CALL timing_stop('tra_zdf')99 IF( ln_timing ) CALL timing_stop('tra_zdf') 100 100 ! 101 101 END SUBROUTINE tra_zdf … … 135 135 !!--------------------------------------------------------------------- 136 136 ! 137 IF( nn_timing == 1 )CALL timing_start('tra_zdf_imp')137 IF( ln_timing ) CALL timing_start('tra_zdf_imp') 138 138 ! 139 139 IF( kt == kit000 ) THEN … … 255 255 ! ! ================= ! 256 256 ! 257 IF( nn_timing == 1 )CALL timing_stop('tra_zdf_imp')257 IF( ln_timing ) CALL timing_stop('tra_zdf_imp') 258 258 ! 259 259 END SUBROUTINE tra_zdf_imp -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/zpshde.F90
r7753 r8568 22 22 USE lbclnk ! lateral boundary conditions (or mpp link) 23 23 USE lib_mpp ! MPP library 24 USE wrk_nemo ! Memory allocation25 24 USE timing ! Timing 26 25 … … 99 98 !!---------------------------------------------------------------------- 100 99 ! 101 IF( nn_timing == 1) CALL timing_start( 'zps_hde')102 ! 103 pgtu(:,:,:) =0._wp ; zti (:,:,:)=0._wp ; zhi (:,: )=0._wp104 pgtv(:,:,:) =0._wp ; ztj (:,:,:)=0._wp ; zhj (:,: )=0._wp100 IF( ln_timing ) CALL timing_start( 'zps_hde') 101 ! 102 pgtu(:,:,:) = 0._wp ; zti (:,:,:) = 0._wp ; zhi (:,:) = 0._wp 103 pgtv(:,:,:) = 0._wp ; ztj (:,:,:) = 0._wp ; zhj (:,:) = 0._wp 105 104 ! 106 105 DO jn = 1, kjpt !== Interpolation of tracers at the last ocean level ==! … … 188 187 END IF 189 188 ! 190 IF( nn_timing == 1) CALL timing_stop( 'zps_hde')189 IF( ln_timing ) CALL timing_stop( 'zps_hde') 191 190 ! 192 191 END SUBROUTINE zps_hde 193 ! 192 193 194 194 SUBROUTINE zps_hde_isf( kt, kjpt, pta, pgtu, pgtv, pgtui, pgtvi, & 195 195 & prd, pgru, pgrv, pgrui, pgrvi ) … … 256 256 !!---------------------------------------------------------------------- 257 257 ! 258 IF( nn_timing == 1 )CALL timing_start( 'zps_hde_isf')258 IF( ln_timing ) CALL timing_start( 'zps_hde_isf') 259 259 ! 260 260 pgtu (:,:,:) = 0._wp ; pgtv (:,:,:) =0._wp … … 453 453 END IF 454 454 ! 455 IF( nn_timing == 1) CALL timing_stop( 'zps_hde_isf')455 IF( ln_timing ) CALL timing_stop( 'zps_hde_isf') 456 456 ! 457 457 END SUBROUTINE zps_hde_isf 458 458 459 !!====================================================================== 459 460 END MODULE zpshde
Note: See TracChangeset
for help on using the changeset viewer.