Changeset 9019 for branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA
- Timestamp:
- 2017-12-13T15:58:53+01:00 (6 years ago)
- Location:
- branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA
- Files:
-
- 2 deleted
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/eosbn2.F90
r7753 r9019 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 ) … … 928 927 pn2(ji,jj,jk) = grav * ( zaw * ( pts(ji,jj,jk-1,jp_tem) - pts(ji,jj,jk,jp_tem) ) & 929 928 & - zbw * ( pts(ji,jj,jk-1,jp_sal) - pts(ji,jj,jk,jp_sal) ) ) & 930 & / e3w_n(ji,jj,jk) * tmask(ji,jj,jk)929 & / e3w_n(ji,jj,jk) * wmask(ji,jj,jk) 931 930 END DO 932 931 END DO … … 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/traadv.F90
r7753 r9019 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_cen.F90
r7646 r9019 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_fct.F90
r7753 r9019 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_mle.F90
r7753 r9019 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_mus.F90
r7753 r9019 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_qck.F90
r7646 r9019 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 … … 353 346 END DO 354 347 ! ! trend diagnostics 355 IF( l_trd ) 348 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pvn, ptn(:,:,:,jn) ) 356 349 ! ! "Poleward" heat and salt transports (contribution of upstream fluxes) 357 IF( l_ptr ) 350 IF( l_ptr ) CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) ) 358 351 ! 359 352 END DO 360 !361 CALL wrk_dealloc( jpi, jpj, jpk, zwy, zfu, zfc, zfd )362 353 ! 363 354 END SUBROUTINE tra_adv_qck_j … … 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_ubs.F90
r7646 r9019 20 20 USE diaptr ! poleward transport diagnostics 21 21 USE diaar5 ! AR5 diagnostics 22 23 22 ! 24 USE iom 25 USE lib_mpp ! I/Olibrary23 USE iom ! I/O library 24 USE lib_mpp ! massively parallel library 26 25 USE lbclnk ! ocean lateral boundary condition (or mpp link) 27 26 USE in_out_manager ! I/O manager 28 USE wrk_nemo ! Memory Allocation29 27 USE timing ! Timing 30 28 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) … … 101 99 REAL(wp) :: zfp_ui, zfm_ui, zcenut, ztak, zfp_wk, zfm_wk ! - - 102 100 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 ) 101 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztu, ztv, zltu, zltv, zti, ztw ! 3D workspace 102 !!---------------------------------------------------------------------- 103 ! 104 IF( ln_timing ) CALL timing_start('tra_adv_ubs') 109 105 ! 110 106 IF( kt == kit000 ) THEN … … 285 281 END DO 286 282 ! 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') 283 IF( ln_timing ) CALL timing_stop('tra_adv_ubs') 290 284 ! 291 285 END SUBROUTINE tra_adv_ubs … … 313 307 INTEGER :: ikm1 ! local integer 314 308 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 ) 309 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zbetup, zbetdo ! 3D workspace 310 !!---------------------------------------------------------------------- 311 ! 312 IF( ln_timing ) CALL timing_start('nonosc_z') 321 313 ! 322 314 zbig = 1.e+40_wp … … 387 379 END DO 388 380 ! 389 CALL wrk_dealloc( jpi,jpj,jpk, zbetup, zbetdo ) 390 ! 391 IF( nn_timing == 1 ) CALL timing_stop('nonosc_z') 381 IF( ln_timing ) CALL timing_stop('nonosc_z') 392 382 ! 393 383 END SUBROUTINE nonosc_z -
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/trabbc.F90
r7753 r9019 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 !!---------------------------------------------------------------------- … … 161 160 ! 162 161 CASE ( 1 ) !* constant flux 163 IF(lwp) WRITE(numout,*) ' ***constant heat flux = ', rn_geoflx_cst162 IF(lwp) WRITE(numout,*) ' ===>> constant heat flux = ', rn_geoflx_cst 164 163 qgh_trd0(:,:) = r1_rau0_rcp * rn_geoflx_cst 165 164 ! 166 165 CASE ( 2 ) !* variable geothermal heat flux : read the geothermal fluxes in mW/m2 167 IF(lwp) WRITE(numout,*) ' ***variable geothermal heat flux'166 IF(lwp) WRITE(numout,*) ' ===>> variable geothermal heat flux' 168 167 ! 169 168 ALLOCATE( sf_qgh(1), STAT=ierror ) … … 173 172 ENDIF 174 173 ALLOCATE( sf_qgh(1)%fnow(jpi,jpj,1) ) 175 IF( sn_qgh%ln_tint ) ALLOCATE( sf_qgh(1)%fdta(jpi,jpj,1,2) )174 IF( sn_qgh%ln_tint ) ALLOCATE( sf_qgh(1)%fdta(jpi,jpj,1,2) ) 176 175 ! fill sf_chl with sn_chl and control print 177 176 CALL fld_fill( sf_qgh, (/ sn_qgh /), cn_dir, 'tra_bbc_init', & … … 187 186 ! 188 187 ELSE 189 IF(lwp) WRITE(numout,*) ' ***no geothermal heat flux'188 IF(lwp) WRITE(numout,*) ' ===>> no geothermal heat flux' 190 189 ENDIF 191 190 ! -
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/trabbl.F90
r8509 r9019 13 13 !! - ! 2010-11 (G. Madec) add mbk. arrays associated to the deepest ocean level 14 14 !! - ! 2013-04 (F. Roquet, G. Madec) use of eosbn2 instead of local hard coded alpha and beta 15 !! 4.0 ! 2017-04 (G. Madec) ln_trabbl namelist variable instead of a CPP key 15 16 !!---------------------------------------------------------------------- 16 #if defined key_trabbl 17 !!---------------------------------------------------------------------- 18 !! 'key_trabbl' or bottom boundary layer 17 19 18 !!---------------------------------------------------------------------- 20 19 !! tra_bbl_alloc : allocate trabbl arrays … … 36 35 USE lbclnk ! ocean lateral boundary conditions 37 36 USE prtctl ! Print control 38 USE wrk_nemo ! Memory Allocation39 37 USE timing ! Timing 40 38 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) … … 49 47 PUBLIC bbl ! routine called by trcbbl.F90 and dtadyn.F90 50 48 51 LOGICAL, PUBLIC, PARAMETER :: lk_trabbl = .TRUE. !: bottom boundary layer flag52 53 49 ! !!* Namelist nambbl * 50 LOGICAL , PUBLIC :: ln_trabbl !: bottom boundary layer flag 54 51 INTEGER , PUBLIC :: nn_bbl_ldf !: =1 : diffusive bbl or not (=0) 55 52 INTEGER , PUBLIC :: nn_bbl_adv !: =1/2 : advective bbl or not (=0) … … 82 79 !! *** FUNCTION tra_bbl_alloc *** 83 80 !!---------------------------------------------------------------------- 84 ALLOCATE( utr_bbl (jpi,jpj) , ahu_bbl (jpi,jpj) , mbku_d 85 & vtr_bbl (jpi,jpj) , ahv_bbl (jpi,jpj) , mbkv_d 86 & ahu_bbl_0(jpi,jpj) , ahv_bbl_0(jpi,jpj) , 87 & e3u_bbl_0(jpi,jpj) , e3v_bbl_0(jpi,jpj) , 81 ALLOCATE( utr_bbl (jpi,jpj) , ahu_bbl (jpi,jpj) , mbku_d(jpi,jpj) , mgrhu(jpi,jpj) , & 82 & vtr_bbl (jpi,jpj) , ahv_bbl (jpi,jpj) , mbkv_d(jpi,jpj) , mgrhv(jpi,jpj) , & 83 & ahu_bbl_0(jpi,jpj) , ahv_bbl_0(jpi,jpj) , & 84 & e3u_bbl_0(jpi,jpj) , e3v_bbl_0(jpi,jpj) , STAT=tra_bbl_alloc ) 88 85 ! 89 86 IF( lk_mpp ) CALL mpp_sum ( tra_bbl_alloc ) … … 106 103 INTEGER, INTENT( in ) :: kt ! ocean time-step 107 104 ! 108 REAL(wp), POINTER, DIMENSION(:,:,:) ::ztrdt, ztrds109 !!---------------------------------------------------------------------- 110 ! 111 IF( nn_timing == 1 )CALL timing_start( 'tra_bbl')112 ! 113 IF( l_trdtra ) THEN !* Save the input trends114 CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds)105 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdt, ztrds 106 !!---------------------------------------------------------------------- 107 ! 108 IF( ln_timing ) CALL timing_start( 'tra_bbl') 109 ! 110 IF( l_trdtra ) THEN !* Save the T-S input trends 111 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 115 112 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 116 113 ztrds(:,:,:) = tsa(:,:,:,jp_sal) … … 150 147 CALL trd_tra( kt, 'TRA', jp_tem, jptra_bbl, ztrdt ) 151 148 CALL trd_tra( kt, 'TRA', jp_sal, jptra_bbl, ztrds ) 152 CALL wrk_dealloc( jpi, jpj, jpk,ztrdt, ztrds )153 ENDIF 154 ! 155 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') 156 153 ! 157 154 END SUBROUTINE tra_bbl … … 186 183 INTEGER :: ik ! local integers 187 184 REAL(wp) :: zbtr ! local scalars 188 REAL(wp), POINTER, DIMENSION(:,:) :: zptb 189 !!---------------------------------------------------------------------- 190 ! 191 IF( nn_timing == 1 ) CALL timing_start('tra_bbl_dif') 192 ! 193 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') 194 189 ! 195 190 DO jn = 1, kjpt ! tracer loop … … 216 211 END DO ! end tracer 217 212 ! ! =========== 218 CALL wrk_dealloc( jpi, jpj, zptb ) 219 ! 220 IF( nn_timing == 1 ) CALL timing_stop('tra_bbl_dif') 213 ! 214 IF( ln_timing ) CALL timing_stop('tra_bbl_dif') 221 215 ! 222 216 END SUBROUTINE tra_bbl_dif … … 249 243 !!---------------------------------------------------------------------- 250 244 ! 251 IF( nn_timing == 1 )CALL timing_start( 'tra_bbl_adv')245 IF( ln_timing ) CALL timing_start( 'tra_bbl_adv') 252 246 ! ! =========== 253 247 DO jn = 1, kjpt ! tracer loop … … 301 295 ! 302 296 END DO 303 ! ! =========== 304 END DO ! end tracer 305 ! ! =========== 306 IF( nn_timing == 1 ) CALL timing_stop( 'tra_bbl_adv') 297 ! ! =========== 298 END DO ! end tracer 299 ! ! =========== 300 ! 301 IF( ln_timing ) CALL timing_stop( 'tra_bbl_adv') 307 302 ! 308 303 END SUBROUTINE tra_bbl_adv … … 349 344 !!---------------------------------------------------------------------- 350 345 ! 351 IF( nn_timing == 1 )CALL timing_start( 'bbl')346 IF( ln_timing ) CALL timing_start( 'bbl') 352 347 ! 353 348 IF( kt == kit000 ) THEN … … 480 475 ENDIF 481 476 ! 482 IF( nn_timing == 1 )CALL timing_stop( 'bbl')477 IF( ln_timing ) CALL timing_stop( 'bbl') 483 478 ! 484 479 END SUBROUTINE bbl … … 494 489 !! called by nemo_init at the first timestep (kit000) 495 490 !!---------------------------------------------------------------------- 496 INTEGER :: ji, jj ! dummy loop indices 497 INTEGER :: ii0, ii1, ij0, ij1 ! local integer 498 INTEGER :: ios ! - - 499 REAL(wp), POINTER, DIMENSION(:,:) :: zmbk 500 ! 501 NAMELIST/nambbl/ nn_bbl_ldf, nn_bbl_adv, rn_ahtbbl, rn_gambbl 502 !!---------------------------------------------------------------------- 503 ! 504 IF( nn_timing == 1 ) CALL timing_start( 'tra_bbl_init') 491 INTEGER :: ji, jj ! dummy loop indices 492 INTEGER :: ii0, ii1, ij0, ij1, ios ! local integer 493 REAL(wp), DIMENSION(jpi,jpj) :: zmbk ! workspace 494 !! 495 NAMELIST/nambbl/ ln_trabbl, nn_bbl_ldf, nn_bbl_adv, rn_ahtbbl, rn_gambbl 496 !!---------------------------------------------------------------------- 497 ! 498 IF( ln_timing ) CALL timing_start( 'tra_bbl_init') 505 499 ! 506 500 REWIND( numnam_ref ) ! Namelist nambbl in reference namelist : Bottom boundary layer scheme … … 519 513 WRITE(numout,*) 'tra_bbl_init : bottom boundary layer initialisation' 520 514 WRITE(numout,*) '~~~~~~~~~~~~' 521 WRITE(numout,*) ' Namelist nambbl : set bbl parameters' 522 WRITE(numout,*) ' diffusive bbl (=1) or not (=0) nn_bbl_ldf = ', nn_bbl_ldf 523 WRITE(numout,*) ' advective bbl (=1/2) or not (=0) nn_bbl_adv = ', nn_bbl_adv 524 WRITE(numout,*) ' diffusive bbl coefficient rn_ahtbbl = ', rn_ahtbbl, ' m2/s' 525 WRITE(numout,*) ' advective bbl coefficient rn_gambbl = ', rn_gambbl, ' s' 526 ENDIF 527 515 WRITE(numout,*) ' Namelist nambbl : set bbl parameters' 516 WRITE(numout,*) ' bottom boundary layer flag ln_trabbl = ', ln_trabbl 517 ENDIF 518 IF( .NOT.ln_trabbl ) RETURN 519 ! 520 IF(lwp) THEN 521 WRITE(numout,*) ' diffusive bbl (=1) or not (=0) nn_bbl_ldf = ', nn_bbl_ldf 522 WRITE(numout,*) ' advective bbl (=1/2) or not (=0) nn_bbl_adv = ', nn_bbl_adv 523 WRITE(numout,*) ' diffusive bbl coefficient rn_ahtbbl = ', rn_ahtbbl, ' m2/s' 524 WRITE(numout,*) ' advective bbl coefficient rn_gambbl = ', rn_gambbl, ' s' 525 ENDIF 526 ! 528 527 ! ! allocate trabbl arrays 529 528 IF( tra_bbl_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'tra_bbl_init : unable to allocate arrays' ) 530 529 ! 531 530 IF( nn_bbl_adv == 1 ) WRITE(numout,*) ' * Advective BBL using upper velocity' 532 531 IF( nn_bbl_adv == 2 ) WRITE(numout,*) ' * Advective BBL using velocity = F( delta rho)' 533 532 ! 534 533 ! !* vertical index of "deep" bottom u- and v-points 535 534 DO jj = 1, jpjm1 ! (the "shelf" bottom k-indices are mbku and mbkv) … … 540 539 END DO 541 540 ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk 542 CALL wrk_alloc( jpi, jpj, zmbk )543 541 zmbk(:,:) = REAL( mbku_d(:,:), wp ) ; CALL lbc_lnk(zmbk,'U',1.) ; mbku_d(:,:) = MAX( INT( zmbk(:,:) ), 1 ) 544 542 zmbk(:,:) = REAL( mbkv_d(:,:), wp ) ; CALL lbc_lnk(zmbk,'V',1.) ; mbkv_d(:,:) = MAX( INT( zmbk(:,:) ), 1 ) 545 CALL wrk_dealloc( jpi, jpj, zmbk ) 546 543 ! 547 544 !* sign of grad(H) at u- and v-points; zero if grad(H) = 0 548 545 mgrhu(:,:) = 0 ; mgrhv(:,:) = 0 … … 570 567 ahu_bbl_0(:,:) = rn_ahtbbl * e2_e1u(:,:) * e3u_bbl_0(:,:) * umask(:,:,1) 571 568 ahv_bbl_0(:,:) = rn_ahtbbl * e1_e2v(:,:) * e3v_bbl_0(:,:) * vmask(:,:,1) 572 573 ! 574 IF( nn_timing == 1 ) CALL timing_stop( 'tra_bbl_init') 569 ! 570 IF( ln_timing ) CALL timing_stop( 'tra_bbl_init') 575 571 ! 576 572 END SUBROUTINE tra_bbl_init 577 578 #else579 !!----------------------------------------------------------------------580 !! Dummy module : No bottom boundary layer scheme581 !!----------------------------------------------------------------------582 LOGICAL, PUBLIC, PARAMETER :: lk_trabbl = .FALSE. !: bbl flag583 CONTAINS584 SUBROUTINE tra_bbl_init ! Dummy routine585 END SUBROUTINE tra_bbl_init586 SUBROUTINE tra_bbl( kt ) ! Dummy routine587 WRITE(*,*) 'tra_bbl: You should not have seen this print! error?', kt588 END SUBROUTINE tra_bbl589 #endif590 573 591 574 !!====================================================================== -
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/tradmp.F90
r7753 r9019 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/traldf.F90
r7765 r9019 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_iso.F90
r7753 r9019 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_lap_blp.F90
r7646 r9019 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_triad.F90
r7646 r9019 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/tranpc.F90
r6140 r9019 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/tranxt.F90
r8698 r9019 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 … … 114 113 115 114 ! set time step size (Euler/Leapfrog) 116 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt! at nit000 (Euler)115 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! at nit000 (Euler) 117 116 ELSEIF( kt <= nit000 + 1 ) THEN ; r2dt = 2._wp* rdt ! at nit000 or nit000+1 (Leapfrog) 118 117 ENDIF … … 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(:,:,jpk) = 0._wp 124 123 ztrds(:,:,jpk) = 0._wp … … 136 135 CALL trd_tra( kt, 'TRA', jp_tem, jptra_tot, ztrdt ) 137 136 CALL trd_tra( kt, 'TRA', jp_sal, jptra_tot, ztrds ) 138 IF( ln_linssh ) THEN 137 IF( ln_linssh ) THEN ! linear sea surface height only 139 138 ! Store now fields before applying the Asselin filter 140 139 ! in order to calculate Asselin filter trend later. … … 150 149 END DO 151 150 END DO 152 IF (l_trdtra .AND. .NOT. ln_linssh ) THEN! Zero Asselin filter contribution must be explicitly written out since for vvl153 ! Asselin filter is output by tra_nxt_vvl that is not called on this time step151 IF (l_trdtra .AND. .NOT. ln_linssh ) THEN ! Zero Asselin filter contribution must be explicitly written out since for vvl 152 ! ! Asselin filter is output by tra_nxt_vvl that is not called on this time step 154 153 ztrdt(:,:,:) = 0._wp 155 154 ztrds(:,:,:) = 0._wp … … 181 180 CALL trd_tra( kt, 'TRA', jp_sal, jptra_atf, ztrds ) 182 181 END IF 183 IF( l_trdtra ) CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds )182 IF( l_trdtra ) DEALLOCATE( ztrdt , ztrds ) 184 183 ! 185 184 ! ! control print … … 187 186 & tab3d_2=tsn(:,:,:,jp_sal), clinfo2= ' Sn: ', mask2=tmask ) 188 187 ! 189 IF( nn_timing == 1) CALL timing_stop('tra_nxt')188 IF( ln_timing ) CALL timing_stop('tra_nxt') 190 189 ! 191 190 END SUBROUTINE tra_nxt … … 271 270 REAL(wp) :: zfact, zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d ! local scalar 272 271 REAL(wp) :: zfact2, ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d ! - - 273 REAL(wp), POINTER, DIMENSION(:,:,:,:) ::ztrd_atf272 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) :: ztrd_atf 274 273 !!---------------------------------------------------------------------- 275 274 ! … … 290 289 ENDIF 291 290 ! 292 IF( ( l_trdtra . and. cdtype == 'TRA' ) .OR. ( l_trdtrc .and. cdtype == 'TRC' ) ) THEN293 CALL wrk_alloc( jpi, jpj, jpk, kjpt, ztrd_atf)291 IF( ( l_trdtra .AND. cdtype == 'TRA' ) .OR. ( l_trdtrc .AND. cdtype == 'TRC' ) ) THEN 292 ALLOCATE( ztrd_atf(jpi,jpj,jpk,kjpt) ) 294 293 ztrd_atf(:,:,:,:) = 0.0_wp 295 294 ENDIF 296 295 zfact = 1._wp / r2dt 296 zfact1 = atfp * p2dt 297 zfact2 = zfact1 * r1_rau0 297 298 DO jn = 1, kjpt 298 299 DO jk = 1, jpkm1 299 zfact1 = atfp * p2dt300 zfact2 = zfact1 * r1_rau0301 300 DO jj = 2, jpjm1 302 301 DO ji = fs_2, fs_jpim1 … … 357 356 END DO 358 357 ! 359 IF( l_trdtra .and. cdtype == 'TRA' ) THEN 360 CALL trd_tra( kt, cdtype, jp_tem, jptra_atf, ztrd_atf(:,:,:,jp_tem) ) 361 CALL trd_tra( kt, cdtype, jp_sal, jptra_atf, ztrd_atf(:,:,:,jp_sal) ) 362 CALL wrk_dealloc( jpi, jpj, jpk, kjpt, ztrd_atf ) 363 ENDIF 364 IF( l_trdtrc .and. cdtype == 'TRC' ) THEN 365 DO jn = 1, kjpt 366 CALL trd_tra( kt, cdtype, jn, jptra_atf, ztrd_atf(:,:,:,jn) ) 367 END DO 368 CALL wrk_dealloc( jpi, jpj, jpk, kjpt, ztrd_atf ) 358 IF( ( l_trdtra .AND. cdtype == 'TRA' ) .OR. ( l_trdtrc .AND. cdtype == 'TRC' ) ) THEN 359 IF( l_trdtra .AND. cdtype == 'TRA' ) THEN 360 CALL trd_tra( kt, cdtype, jp_tem, jptra_atf, ztrd_atf(:,:,:,jp_tem) ) 361 CALL trd_tra( kt, cdtype, jp_sal, jptra_atf, ztrd_atf(:,:,:,jp_sal) ) 362 ENDIF 363 IF( l_trdtrc .AND. cdtype == 'TRC' ) THEN 364 DO jn = 1, kjpt 365 CALL trd_tra( kt, cdtype, jn, jptra_atf, ztrd_atf(:,:,:,jn) ) 366 END DO 367 ENDIF 368 DEALLOCATE( ztrd_atf ) 369 369 ENDIF 370 370 ! -
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/traqsr.F90
r7753 r9019 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 … … 48 47 LOGICAL , PUBLIC :: ln_qsr_2bd !: 2 band light absorption flag 49 48 LOGICAL , PUBLIC :: ln_qsr_bio !: bio-model light absorption flag 50 LOGICAL , PUBLIC :: ln_qsr_ice !: light penetration for ice-model LIM3 (clem)51 49 INTEGER , PUBLIC :: nn_chldta !: use Chlorophyll data (=1) or not (=0) 52 50 REAL(wp), PUBLIC :: rn_abs !: fraction absorbed in the very near surface (RGB & 2 bands) … … 113 111 REAL(wp) :: zCb, zCmax, zze, zpsi, zpsimax, zdelpsi, zCtot, zCze 114 112 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')113 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zekb, zekg, zekr 114 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ze0, ze1, ze2, ze3, zea, ztrdt 115 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zetot, zchl3d 116 !!---------------------------------------------------------------------- 117 ! 118 IF( ln_timing ) CALL timing_start('tra_qsr') 121 119 ! 122 120 IF( kt == nit000 ) THEN … … 127 125 ! 128 126 IF( l_trdtra ) THEN ! trends diagnostic: save the input temperature trend 129 CALL wrk_alloc( jpi,jpj,jpk, ztrdt)127 ALLOCATE( ztrdt(jpi,jpj,jpk) ) 130 128 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 131 129 ENDIF … … 161 159 CASE( np_RGB , np_RGBc ) !== R-G-B fluxes ==! 162 160 ! 163 CALL wrk_alloc( jpi,jpj, zekb, zekg, zekr ) 164 CALL wrk_alloc( jpi,jpj,jpk, ze0, ze1, ze2, ze3, zea, zchl3d ) 161 ALLOCATE( zekb(jpi,jpj) , zekg(jpi,jpj) , zekr (jpi,jpj) , & 162 & ze0 (jpi,jpj,jpk) , ze1 (jpi,jpj,jpk) , ze2 (jpi,jpj,jpk) , & 163 & ze3 (jpi,jpj,jpk) , zea (jpi,jpj,jpk) , zchl3d(jpi,jpj,jpk) ) 165 164 ! 166 165 IF( nqsr == np_RGBc ) THEN !* Variable Chlorophyll … … 240 239 END DO 241 240 ! 242 CALL wrk_dealloc( jpi,jpj, zekb, zekg, zekr ) 243 CALL wrk_dealloc( jpi,jpj,jpk, ze0, ze1, ze2, ze3, zea, zchl3d ) 241 DEALLOCATE( zekb , zekg , zekr , ze0 , ze1 , ze2 , ze3 , zea , zchl3d ) 244 242 ! 245 243 CASE( np_2BD ) !== 2-bands fluxes ==! … … 269 267 END DO 270 268 ! 271 IF( ln_qsr_ice ) THEN ! sea-ice: store the 1st ocean level attenuation coefficient 272 DO jj = 2, jpjm1 273 DO ji = fs_2, fs_jpim1 ! vector opt. 274 IF( qsr(ji,jj) /= 0._wp ) THEN ; fraqsr_1lev(ji,jj) = qsr_hc(ji,jj,1) / ( r1_rau0_rcp * qsr(ji,jj) ) 275 ELSE ; fraqsr_1lev(ji,jj) = 1._wp 276 ENDIF 277 END DO 278 END DO 279 ! Update haloes since lim_thd needs fraqsr_1lev to be defined everywhere 280 CALL lbc_lnk( fraqsr_1lev(:,:), 'T', 1._wp ) 281 ENDIF 269 ! sea-ice: store the 1st ocean level attenuation coefficient 270 DO jj = 2, jpjm1 271 DO ji = fs_2, fs_jpim1 ! vector opt. 272 IF( qsr(ji,jj) /= 0._wp ) THEN ; fraqsr_1lev(ji,jj) = qsr_hc(ji,jj,1) / ( r1_rau0_rcp * qsr(ji,jj) ) 273 ELSE ; fraqsr_1lev(ji,jj) = 1._wp 274 ENDIF 275 END DO 276 END DO 277 CALL lbc_lnk( fraqsr_1lev(:,:), 'T', 1._wp ) 282 278 ! 283 279 IF( iom_use('qsr3d') ) THEN ! output the shortwave Radiation distribution 284 CALL wrk_alloc( jpi,jpj,jpk, zetot ) 285 ! 280 ALLOCATE( zetot(jpi,jpj,jpk) ) 286 281 zetot(:,:,nksr+1:jpk) = 0._wp ! below ~400m set to zero 287 282 DO jk = nksr, 1, -1 288 zetot(:,:,jk) = zetot(:,:,jk+1) + qsr_hc(:,:,jk) / r1_rau0_rcp283 zetot(:,:,jk) = zetot(:,:,jk+1) + qsr_hc(:,:,jk) * rau0_rcp 289 284 END DO 290 285 CALL iom_put( 'qsr3d', zetot ) ! 3D distribution of shortwave Radiation 291 ! 292 CALL wrk_dealloc( jpi,jpj,jpk, zetot ) 286 DEALLOCATE( zetot ) 293 287 ENDIF 294 288 ! … … 301 295 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:) 302 296 CALL trd_tra( kt, 'TRA', jp_tem, jptra_qsr, ztrdt ) 303 CALL wrk_dealloc( jpi,jpj,jpk,ztrdt )297 DEALLOCATE( ztrdt ) 304 298 ENDIF 305 299 ! ! print mean trends (used for debugging) 306 300 IF(ln_ctl) CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' qsr - Ta: ', mask1=tmask, clinfo3='tra-ta' ) 307 301 ! 308 IF( nn_timing == 1 )CALL timing_stop('tra_qsr')302 IF( ln_timing ) CALL timing_stop('tra_qsr') 309 303 ! 310 304 END SUBROUTINE tra_qsr … … 336 330 TYPE(FLD_N) :: sn_chl ! informations about the chlorofyl field to be read 337 331 !! 338 NAMELIST/namtra_qsr/ sn_chl, cn_dir, ln_qsr_rgb, ln_qsr_2bd, ln_qsr_bio, ln_qsr_ice,&332 NAMELIST/namtra_qsr/ sn_chl, cn_dir, ln_qsr_rgb, ln_qsr_2bd, ln_qsr_bio, & 339 333 & nn_chldta, rn_abs, rn_si0, rn_si1 340 334 !!---------------------------------------------------------------------- 341 335 ! 342 IF( nn_timing == 1) CALL timing_start('tra_qsr_init')336 IF( ln_timing ) CALL timing_start('tra_qsr_init') 343 337 ! 344 338 REWIND( numnam_ref ) ! Namelist namtra_qsr in reference namelist … … 359 353 WRITE(numout,*) ' 2 band light penetration ln_qsr_2bd = ', ln_qsr_2bd 360 354 WRITE(numout,*) ' bio-model light penetration ln_qsr_bio = ', ln_qsr_bio 361 WRITE(numout,*) ' light penetration for ice-model (LIM3) ln_qsr_ice = ', ln_qsr_ice362 355 WRITE(numout,*) ' RGB : Chl data (=1) or cst value (=0) nn_chldta = ', nn_chldta 363 356 WRITE(numout,*) ' RGB & 2 bands: fraction of light (rn_si1) rn_abs = ', rn_abs … … 435 428 ENDIF 436 429 ! 437 IF( nn_timing == 1) CALL timing_stop('tra_qsr_init')430 IF( ln_timing ) CALL timing_stop('tra_qsr_init') 438 431 ! 439 432 END SUBROUTINE tra_qsr_init -
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/trasbc.F90
r7788 r9019 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_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf.F90
r8698 r9019 4 4 !! Ocean active tracers: vertical component of the tracer mixing trend 5 5 !!============================================================================== 6 !! History : 1.0 ! 2005-11 (G. Madec) Original code 7 !! 3.0 ! 2008-01 (C. Ethe, G. Madec) merge TRC-TRA 6 !! History : 1.0 ! 2005-11 (G. Madec) Original code 7 !! 3.0 ! 2008-01 (C. Ethe, G. Madec) merge TRC-TRA 8 !! 4.0 ! 2017-06 (G. Madec) remove explict time-stepping option 8 9 !!---------------------------------------------------------------------- 9 10 10 11 !!---------------------------------------------------------------------- 11 12 !! tra_zdf : Update the tracer trend with the vertical diffusion 12 !! tra_zdf_init : initialisation of the computation13 13 !!---------------------------------------------------------------------- 14 14 USE oce ! ocean dynamics and tracers variables … … 20 20 USE ldftra ! lateral diffusion: eddy diffusivity 21 21 USE ldfslp ! lateral diffusion: iso-neutral slope 22 USE trazdf_exp ! vertical diffusion: explicit (tra_zdf_exp routine)23 USE trazdf_imp ! vertical diffusion: implicit (tra_zdf_imp routine)24 22 USE trd_oce ! trends: ocean variables 25 23 USE trdtra ! trends: tracer trend manager … … 29 27 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 30 28 USE lib_mpp ! MPP library 31 USE wrk_nemo ! Memory allocation32 29 USE timing ! Timing 33 30 … … 35 32 PRIVATE 36 33 37 PUBLIC tra_zdf ! routine called by step.F90 38 PUBLIC tra_zdf_init ! routine called by nemogcm.F90 39 40 INTEGER :: nzdf = 0 ! type vertical diffusion algorithm used (defined from ln_zdf... namlist logicals) 34 PUBLIC tra_zdf ! called by step.F90 35 PUBLIC tra_zdf_imp ! called by trczdf.F90 41 36 42 37 !! * Substitutions 43 # include "zdfddm_substitute.h90"44 38 # include "vectopt_loop_substitute.h90" 45 39 !!---------------------------------------------------------------------- 46 !! NEMO/OPA 3.7 , NEMO Consortium (2015)40 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 47 41 !! $Id$ 48 42 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 56 50 !! ** Purpose : compute the vertical ocean tracer physics. 57 51 !!--------------------------------------------------------------------- 58 INTEGER, INTENT( in ) :: kt ! ocean time-step index 59 ! 60 INTEGER :: jk ! Dummy loop indices 61 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdt, ztrds ! 3D workspace 62 !!--------------------------------------------------------------------- 63 ! 64 IF( nn_timing == 1 ) CALL timing_start('tra_zdf') 65 ! 66 IF( neuler == 0 .AND. kt == nit000 ) THEN ! at nit000 67 r2dt = rdt ! = rdt (restarting with Euler time stepping) 68 ELSEIF( kt <= nit000 + 1) THEN ! at nit000 or nit000+1 69 r2dt = 2. * rdt ! = 2 rdt (leapfrog) 70 ENDIF 71 ! 72 IF( l_trdtra ) THEN !* Save ta and sa trends 73 CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds ) 52 INTEGER, INTENT(in) :: kt ! ocean time-step index 53 ! 54 INTEGER :: jk ! Dummy loop indices 55 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds ! 3D workspace 56 !!--------------------------------------------------------------------- 57 ! 58 IF( ln_timing ) CALL timing_start('tra_zdf') 59 ! 60 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! at nit000, = rdt (restarting with Euler time stepping) 61 ELSEIF( kt <= nit000 + 1 ) THEN ; r2dt = 2. * rdt ! otherwise, = 2 rdt (leapfrog) 62 ENDIF 63 ! 64 IF( l_trdtra ) THEN !* Save ta and sa trends 65 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 74 66 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 75 67 ztrds(:,:,:) = tsa(:,:,:,jp_sal) 76 68 ENDIF 77 69 ! 78 SELECT CASE ( nzdf ) ! compute lateral mixing trend and add it to the general trend 79 CASE ( 0 ) ; CALL tra_zdf_exp( kt, nit000, 'TRA', r2dt, nn_zdfexp, tsb, tsa, jpts ) ! explicit scheme 80 CASE ( 1 ) ; CALL tra_zdf_imp( kt, nit000, 'TRA', r2dt, tsb, tsa, jpts ) ! implicit scheme 81 END SELECT 70 ! !* compute lateral mixing trend and add it to the general trend 71 CALL tra_zdf_imp( kt, nit000, 'TRA', r2dt, tsb, tsa, jpts ) 72 82 73 !!gm WHY here ! and I don't like that ! 83 74 ! DRAKKAR SSS control { … … 90 81 DO jk = 1, jpkm1 91 82 ztrdt(:,:,jk) = ( ( tsa(:,:,jk,jp_tem)*e3t_a(:,:,jk) - tsb(:,:,jk,jp_tem)*e3t_b(:,:,jk) ) & 92 &/ (e3t_n(:,:,jk)*r2dt) ) - ztrdt(:,:,jk)83 & / (e3t_n(:,:,jk)*r2dt) ) - ztrdt(:,:,jk) 93 84 ztrds(:,:,jk) = ( ( tsa(:,:,jk,jp_sal)*e3t_a(:,:,jk) - tsb(:,:,jk,jp_sal)*e3t_b(:,:,jk) ) & 94 &/ (e3t_n(:,:,jk)*r2dt) ) - ztrds(:,:,jk)85 & / (e3t_n(:,:,jk)*r2dt) ) - ztrds(:,:,jk) 95 86 END DO 96 87 !!gm this should be moved in trdtra.F90 and done on all trends … … 100 91 CALL trd_tra( kt, 'TRA', jp_tem, jptra_zdf, ztrdt ) 101 92 CALL trd_tra( kt, 'TRA', jp_sal, jptra_zdf, ztrds ) 102 CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds )93 DEALLOCATE( ztrdt , ztrds ) 103 94 ENDIF 104 95 ! ! print mean trends (used for debugging) … … 106 97 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 107 98 ! 108 IF( nn_timing == 1 )CALL timing_stop('tra_zdf')99 IF( ln_timing ) CALL timing_stop('tra_zdf') 109 100 ! 110 101 END SUBROUTINE tra_zdf 111 102 112 113 SUBROUTINE tra_zdf_i nit103 104 SUBROUTINE tra_zdf_imp( kt, kit000, cdtype, p2dt, ptb, pta, kjpt ) 114 105 !!---------------------------------------------------------------------- 115 !! *** ROUTINE tra_zdf_init *** 116 !! 117 !! ** Purpose : Choose the vertical mixing scheme 118 !! 119 !! ** Method : Set nzdf from ln_zdfexp 120 !! nzdf = 0 explicit (time-splitting) scheme (ln_zdfexp=T) 121 !! = 1 implicit (euler backward) scheme (ln_zdfexp=F) 122 !! NB: rotation of lateral mixing operator or TKE & GLS schemes, 123 !! an implicit scheme is required. 124 !!---------------------------------------------------------------------- 125 USE zdftke 126 USE zdfgls 127 !!---------------------------------------------------------------------- 128 ! 129 ! Choice from ln_zdfexp already read in namelist in zdfini module 130 IF( ln_zdfexp ) THEN ; nzdf = 0 ! use explicit scheme 131 ELSE ; nzdf = 1 ! use implicit scheme 132 ENDIF 133 ! 134 ! Force implicit schemes 135 IF( lk_zdftke .OR. lk_zdfgls ) nzdf = 1 ! TKE, or GLS physics 136 IF( ln_traldf_iso ) nzdf = 1 ! iso-neutral lateral physics 137 IF( ln_traldf_hor .AND. ln_sco ) nzdf = 1 ! horizontal lateral physics in s-coordinate 138 IF( ln_zdfexp .AND. nzdf == 1 ) CALL ctl_stop( 'tra_zdf : If using the rotation of lateral mixing operator', & 139 & ' GLS or TKE scheme, the implicit scheme is required, set ln_zdfexp = .false.' ) 140 ! 141 IF(lwp) THEN 142 WRITE(numout,*) 143 WRITE(numout,*) 'tra_zdf_init : vertical tracer physics scheme' 144 WRITE(numout,*) '~~~~~~~~~~~' 145 IF( nzdf == 0 ) WRITE(numout,*) ' ===>> Explicit time-splitting scheme' 146 IF( nzdf == 1 ) WRITE(numout,*) ' ===>> Implicit (euler backward) scheme' 147 ENDIF 148 ! 149 END SUBROUTINE tra_zdf_init 106 !! *** ROUTINE tra_zdf_imp *** 107 !! 108 !! ** Purpose : Compute the after tracer through a implicit computation 109 !! of the vertical tracer diffusion (including the vertical component 110 !! of lateral mixing (only for 2nd order operator, for fourth order 111 !! it is already computed and add to the general trend in traldf) 112 !! 113 !! ** Method : The vertical diffusion of a tracer ,t , is given by: 114 !! difft = dz( avt dz(t) ) = 1/e3t dk+1( avt/e3w dk(t) ) 115 !! It is computed using a backward time scheme (t=after field) 116 !! which provide directly the after tracer field. 117 !! If ln_zdfddm=T, use avs for salinity or for passive tracers 118 !! Surface and bottom boundary conditions: no diffusive flux on 119 !! both tracers (bottom, applied through the masked field avt). 120 !! If iso-neutral mixing, add to avt the contribution due to lateral mixing. 121 !! 122 !! ** Action : - pta becomes the after tracer 123 !!--------------------------------------------------------------------- 124 INTEGER , INTENT(in ) :: kt ! ocean time-step index 125 INTEGER , INTENT(in ) :: kit000 ! first time step index 126 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 127 INTEGER , INTENT(in ) :: kjpt ! number of tracers 128 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 129 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 130 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! in: tracer trend ; out: after tracer field 131 ! 132 INTEGER :: ji, jj, jk, jn ! dummy loop indices 133 REAL(wp) :: zrhs ! local scalars 134 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwi, zwt, zwd, zws 135 !!--------------------------------------------------------------------- 136 ! 137 IF( ln_timing ) CALL timing_start('tra_zdf_imp') 138 ! 139 IF( kt == kit000 ) THEN 140 IF(lwp)WRITE(numout,*) 141 IF(lwp)WRITE(numout,*) 'tra_zdf_imp : implicit vertical mixing on ', cdtype 142 IF(lwp)WRITE(numout,*) '~~~~~~~~~~~ ' 143 ENDIF 144 ! ! ============= ! 145 DO jn = 1, kjpt ! tracer loop ! 146 ! ! ============= ! 147 ! Matrix construction 148 ! -------------------- 149 ! Build matrix if temperature or salinity (only in double diffusion case) or first passive tracer 150 ! 151 IF( ( cdtype == 'TRA' .AND. ( jn == jp_tem .OR. ( jn == jp_sal .AND. ln_zdfddm ) ) ) .OR. & 152 & ( cdtype == 'TRC' .AND. jn == 1 ) ) THEN 153 ! 154 ! vertical mixing coef.: avt for temperature, avs for salinity and passive tracers 155 IF( cdtype == 'TRA' .AND. jn == jp_tem ) THEN ; zwt(:,:,2:jpk) = avt(:,:,2:jpk) 156 ELSE ; zwt(:,:,2:jpk) = avs(:,:,2:jpk) 157 ENDIF 158 zwt(:,:,1) = 0._wp 159 ! 160 IF( l_ldfslp ) THEN ! isoneutral diffusion: add the contribution 161 IF( ln_traldf_msc ) THEN ! MSC iso-neutral operator 162 DO jk = 2, jpkm1 163 DO jj = 2, jpjm1 164 DO ji = fs_2, fs_jpim1 ! vector opt. 165 zwt(ji,jj,jk) = zwt(ji,jj,jk) + akz(ji,jj,jk) 166 END DO 167 END DO 168 END DO 169 ELSE ! standard or triad iso-neutral operator 170 DO jk = 2, jpkm1 171 DO jj = 2, jpjm1 172 DO ji = fs_2, fs_jpim1 ! vector opt. 173 zwt(ji,jj,jk) = zwt(ji,jj,jk) + ah_wslp2(ji,jj,jk) 174 END DO 175 END DO 176 END DO 177 ENDIF 178 ENDIF 179 ! 180 ! Diagonal, lower (i), upper (s) (including the bottom boundary condition since avt is masked) 181 DO jk = 1, jpkm1 182 DO jj = 2, jpjm1 183 DO ji = fs_2, fs_jpim1 ! vector opt. 184 !!gm BUG I think, use e3w_a instead of e3w_n, not sure of that 185 zwi(ji,jj,jk) = - p2dt * zwt(ji,jj,jk ) / e3w_n(ji,jj,jk ) 186 zws(ji,jj,jk) = - p2dt * zwt(ji,jj,jk+1) / e3w_n(ji,jj,jk+1) 187 zwd(ji,jj,jk) = e3t_a(ji,jj,jk) - zwi(ji,jj,jk) - zws(ji,jj,jk) 188 END DO 189 END DO 190 END DO 191 ! 192 !! Matrix inversion from the first level 193 !!---------------------------------------------------------------------- 194 ! solve m.x = y where m is a tri diagonal matrix ( jpk*jpk ) 195 ! 196 ! ( zwd1 zws1 0 0 0 )( zwx1 ) ( zwy1 ) 197 ! ( zwi2 zwd2 zws2 0 0 )( zwx2 ) ( zwy2 ) 198 ! ( 0 zwi3 zwd3 zws3 0 )( zwx3 )=( zwy3 ) 199 ! ( ... )( ... ) ( ... ) 200 ! ( 0 0 0 zwik zwdk )( zwxk ) ( zwyk ) 201 ! 202 ! m is decomposed in the product of an upper and lower triangular matrix. 203 ! The 3 diagonal terms are in 3d arrays: zwd, zws, zwi. 204 ! Suffices i,s and d indicate "inferior" (below diagonal), diagonal 205 ! and "superior" (above diagonal) components of the tridiagonal system. 206 ! The solution will be in the 4d array pta. 207 ! The 3d array zwt is used as a work space array. 208 ! En route to the solution pta is used a to evaluate the rhs and then 209 ! used as a work space array: its value is modified. 210 ! 211 DO jj = 2, jpjm1 !* 1st recurrence: Tk = Dk - Ik Sk-1 / Tk-1 (increasing k) 212 DO ji = fs_2, fs_jpim1 ! done one for all passive tracers (so included in the IF instruction) 213 zwt(ji,jj,1) = zwd(ji,jj,1) 214 END DO 215 END DO 216 DO jk = 2, jpkm1 217 DO jj = 2, jpjm1 218 DO ji = fs_2, fs_jpim1 219 zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwt(ji,jj,jk-1) 220 END DO 221 END DO 222 END DO 223 ! 224 ENDIF 225 ! 226 DO jj = 2, jpjm1 !* 2nd recurrence: Zk = Yk - Ik / Tk-1 Zk-1 227 DO ji = fs_2, fs_jpim1 228 pta(ji,jj,1,jn) = e3t_b(ji,jj,1) * ptb(ji,jj,1,jn) + p2dt * e3t_n(ji,jj,1) * pta(ji,jj,1,jn) 229 END DO 230 END DO 231 DO jk = 2, jpkm1 232 DO jj = 2, jpjm1 233 DO ji = fs_2, fs_jpim1 234 zrhs = e3t_b(ji,jj,jk) * ptb(ji,jj,jk,jn) + p2dt * e3t_n(ji,jj,jk) * pta(ji,jj,jk,jn) ! zrhs=right hand side 235 pta(ji,jj,jk,jn) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * pta(ji,jj,jk-1,jn) 236 END DO 237 END DO 238 END DO 239 ! 240 DO jj = 2, jpjm1 !* 3d recurrence: Xk = (Zk - Sk Xk+1 ) / Tk (result is the after tracer) 241 DO ji = fs_2, fs_jpim1 242 pta(ji,jj,jpkm1,jn) = pta(ji,jj,jpkm1,jn) / zwt(ji,jj,jpkm1) * tmask(ji,jj,jpkm1) 243 END DO 244 END DO 245 DO jk = jpk-2, 1, -1 246 DO jj = 2, jpjm1 247 DO ji = fs_2, fs_jpim1 248 pta(ji,jj,jk,jn) = ( pta(ji,jj,jk,jn) - zws(ji,jj,jk) * pta(ji,jj,jk+1,jn) ) & 249 & / zwt(ji,jj,jk) * tmask(ji,jj,jk) 250 END DO 251 END DO 252 END DO 253 ! ! ================= ! 254 END DO ! end tracer loop ! 255 ! ! ================= ! 256 ! 257 IF( ln_timing ) CALL timing_stop('tra_zdf_imp') 258 ! 259 END SUBROUTINE tra_zdf_imp 150 260 151 261 !!============================================================================== -
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/TRA/zpshde.F90
r7753 r9019 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.