Changeset 2104 for branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA
- Timestamp:
- 2010-09-17T14:35:46+02:00 (14 years ago)
- Location:
- branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA
- Files:
-
- 25 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/eosbn2.F90
r2083 r2104 16 16 !! - ! 2003-08 (G. Madec) F90, free form 17 17 !! 3.0 ! 2006-08 (G. Madec) add tfreez function 18 !! 3.3 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA 18 19 !!---------------------------------------------------------------------- 19 20 … … 61 62 # include "vectopt_loop_substitute.h90" 62 63 !!---------------------------------------------------------------------- 63 !! NEMO/OPA 3. 2 , LOCEAN-IPSL (2009)64 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 64 65 !! $Id$ 65 66 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traadv.F90
r2082 r2104 5 5 !!============================================================================== 6 6 !! History : 2.0 ! 2005-11 (G. Madec) Original code 7 !! 3. 0 ! 2008-01(C. Ethe, G. Madec) merge TRC-TRA + switch from velocity to transport7 !! 3.3 ! 2010-09 (C. Ethe, G. Madec) merge TRC-TRA + switch from velocity to transport 8 8 !!---------------------------------------------------------------------- 9 9 … … 50 50 !!---------------------------------------------------------------------- 51 51 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 52 !! $Id$ 52 !! $Id$ 53 53 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 54 54 !!---------------------------------------------------------------------- … … 67 67 !! 68 68 INTEGER :: jk ! dummy loop index 69 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zun, zvn, zwn ! effective transport69 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zun, zvn, zwn ! 3D workspace: effective transport 70 70 !!---------------------------------------------------------------------- 71 71 ! ! set time step … … 135 135 !!---------------------------------------------------------------------- 136 136 INTEGER :: ioptio 137 137 !! 138 138 NAMELIST/namtra_adv/ ln_traadv_cen2 , ln_traadv_tvd, & 139 139 & ln_traadv_muscl, ln_traadv_muscl2, & -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traadv_cen2.F90
r2082 r2104 15 15 16 16 !!---------------------------------------------------------------------- 17 !! tra_adv_cen2 : update the tracer trend with the horizontal and 18 !! vertical advection trends using a seconder order 19 !! ups_orca_set : allow mixed upstream/centered scheme in specific 20 !! area (set for orca 2 and 4 only) 17 !! tra_adv_cen2 : update the tracer trend with the advection trends using a 2nd order centered scheme 18 !! ups_orca_set : allow mixed upstream/centered scheme in specific area (set for orca 2 and 4 only) 21 19 !!---------------------------------------------------------------------- 22 20 USE oce, ONLY: tsn ! now ocean temperature and salinity … … 115 113 USE oce , zwy => va ! use va as workspace 116 114 !! 117 INTEGER , INTENT(in ):: kt ! ocean time-step index118 CHARACTER(len=3) , INTENT(in ):: cdtype ! =TRA or TRC (tracer indicator)119 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk) :: pun, pvn, pwn ! 3 ocean velocity components120 INTEGER , INTENT(in ) :: kjpt ! number of tracers121 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt):: ptb, ptn ! before and now tracer fields122 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta! tracer trend115 INTEGER , INTENT(in ) :: kt ! ocean time-step index 116 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 117 INTEGER , INTENT(in ) :: kjpt ! number of tracers 118 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 119 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 120 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 123 121 !! 124 122 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 136 134 137 135 138 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 )) THEN136 IF( kt == nit000 ) THEN 139 137 IF(lwp) WRITE(numout,*) 140 138 IF(lwp) WRITE(numout,*) 'tra_adv_cen2 : 2nd order centered advection scheme on ', cdtype 141 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~ Vector optimization case'139 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~ ' 142 140 IF(lwp) WRITE(numout,*) 143 141 ! -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traadv_eiv.F90
r2082 r2104 4 4 !! Ocean tracers: advection trend - eddy induced velocity 5 5 !!====================================================================== 6 !! History : 9.0 !05-11 (G. Madec) Original code, from traldf and zdf _iso7 !! 3.3 ! 10-05 (C. Ethe, G. Madec) merge TRC-TRA6 !! History : 1.0 ! 2005-11 (G. Madec) Original code, from traldf and zdf _iso 7 !! 3.3 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA 8 8 !!---------------------------------------------------------------------- 9 9 #if defined key_traldf_eiv || defined key_esopa 10 10 !!---------------------------------------------------------------------- 11 11 !! 'key_traldf_eiv' rotation of the lateral mixing tensor 12 !!----------------------------------------------------------------------13 12 !!---------------------------------------------------------------------- 14 13 !! tra_ldf_iso : update the tracer trend with the horizontal component … … 40 39 # include "vectopt_loop_substitute.h90" 41 40 !!---------------------------------------------------------------------- 42 !! OPA 9.0 , LOCEAN-IPSL (2006)43 !! $Id$ 41 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 42 !! $Id$ 44 43 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 45 44 !!---------------------------------------------------------------------- … … 65 64 !! ** Action : - add to p.n the eiv component 66 65 !!---------------------------------------------------------------------- 67 INTEGER , INTENT(in ) :: kt! ocean time-step index68 CHARACTER(len=3) , INTENT(in) :: cdtype! =TRA or TRC (tracer indicator)69 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pun! in : 3 ocean velocity components70 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pvn! out: 3 ocean velocity components71 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pwn! increased by the eiv66 INTEGER , INTENT(in ) :: kt ! ocean time-step index 67 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 68 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pun ! in : 3 ocean velocity components 69 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pvn ! out: 3 ocean velocity components 70 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pwn ! increased by the eiv 72 71 !! 73 72 INTEGER :: ji, jj, jk ! dummy loop indices 74 REAL(wp) :: zuwk, zuwk1, zuwi, zuwi1 ! temporary scalar75 REAL(wp) :: zvwk, zvwk1, zvwj, zvwj1 ! " "76 REAL(wp), DIMENSION(jpi,jpj) :: zu_eiv, zv_eiv, zw_eiv ! " "73 REAL(wp) :: zuwk, zuwk1, zuwi, zuwi1 ! local scalars 74 REAL(wp) :: zvwk, zvwk1, zvwj, zvwj1 ! - - 75 REAL(wp), DIMENSION(jpi,jpj) :: zu_eiv, zv_eiv, zw_eiv ! 2D workspace 77 76 # if defined key_diaeiv 78 REAL(wp) :: zztmp ! " "79 REAL(wp), DIMENSION(jpi,jpj) :: z2d ! " "77 REAL(wp) :: zztmp ! local scalar 78 REAL(wp), DIMENSION(jpi,jpj) :: z2d ! 2D workspace 80 79 # endif 81 80 !!---------------------------------------------------------------------- 82 81 83 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 )) THEN82 IF( kt == nit000 ) THEN 84 83 IF(lwp) WRITE(numout,*) 85 84 IF(lwp) WRITE(numout,*) 'tra_adv_eiv : eddy induced advection on ', cdtype,' :' … … 95 94 96 95 zu_eiv(:,:) = 0.e0 ; zv_eiv(:,:) = 0.e0 ; zw_eiv(:,:) = 0.e0 96 97 97 ! ================= 98 98 DO jk = 1, jpkm1 ! Horizontal slab … … 188 188 CONTAINS 189 189 SUBROUTINE tra_adv_eiv( kt, pun, pvn, pwn, cdtype ) ! Empty routine 190 INTEGER , INTENT(in ) :: kt ! ocean time-step index191 CHARACTER(len=3) , INTENT(in) :: cdtype ! =TRA or TRC (tracer indicator)190 INTEGER :: kt 191 CHARACTER(len=3) :: cdtype 192 192 REAL, DIMENSION(:,:,:) :: pun, pvn, pwn 193 WRITE(*,*) 'tra_adv_eiv: You should not have seen this print! error?', kt 194 WRITE(*,*) 'tra_adv_eiv: You should not have seen this print! error?', cdtype 193 WRITE(*,*) 'tra_adv_eiv: You should not have seen this print! error?', kt, cdtype 195 194 WRITE(*,*) 'tra_adv_eiv: You should not have seen this print! error?', pun(1,1,1), pvn(1,1,1), pwn(1,1,1) 196 195 END SUBROUTINE tra_adv_eiv -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traadv_muscl.F90
r2083 r2104 65 65 USE oce , zwy => va ! use va as workspace 66 66 !! 67 INTEGER , INTENT(in ):: kt ! ocean time-step index68 CHARACTER(len=3) , INTENT(in ):: cdtype ! =TRA or TRC (tracer indicator)69 INTEGER , INTENT(in ):: kjpt ! number of tracers70 REAL(wp) , INTENT(in ), DIMENSION(jpk):: p2dt ! vertical profile of tracer time-step71 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk):: pun, pvn, pwn ! 3 ocean velocity components72 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb ! before and now tracer fields73 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta! tracer trend67 INTEGER , INTENT(in ) :: kt ! ocean time-step index 68 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 69 INTEGER , INTENT(in ) :: kjpt ! number of tracers 70 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 71 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 72 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before tracer field 73 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 74 74 !! 75 75 INTEGER :: ji, jj, jk, jn ! dummy loop indices 76 REAL(wp) :: zu, z0u, zzwx 77 REAL(wp) :: zv, z0v, zzwy 78 REAL(wp) :: zw, z0w 76 REAL(wp) :: zu, z0u, zzwx ! local scalar 77 REAL(wp) :: zv, z0v, zzwy ! - - 78 REAL(wp) :: zw, z0w ! - - 79 79 REAL(wp) :: ztra, zbtr, zdt, zalpha 80 80 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zslpx, zslpy ! 3D workspace 81 81 !!---------------------------------------------------------------------- 82 82 83 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 )) THEN83 IF( kt == nit000 ) THEN 84 84 WRITE(numout,*) 85 85 WRITE(numout,*) 'tra_adv : MUSCL advection scheme on ', cdtype -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traadv_muscl2.F90
r2083 r2104 28 28 PRIVATE 29 29 30 !! * Accessibility 31 PUBLIC tra_adv_muscl2 ! routine called by step.F90 30 PUBLIC tra_adv_muscl2 ! routine called by step.F90 32 31 33 32 LOGICAL :: l_trd ! flag to compute trends … … 61 60 !! IPSL, Sept. 2000 (http://www.lodyc.jussieu.fr/opa) 62 61 !!---------------------------------------------------------------------- 63 !!* Module used64 62 USE oce , zwx => ua ! use ua as workspace 65 63 USE oce , zwy => va ! use va as workspace 66 !! * Arguments67 INTEGER , INTENT(in ):: kt ! ocean time-step index68 CHARACTER(len=3) , INTENT(in ):: cdtype ! =TRA or TRC (tracer indicator)69 INTEGER , INTENT(in ):: kjpt ! number of tracers70 REAL(wp) , INTENT(in ), DIMENSION(jpk):: p2dt ! vertical profile of tracer time-step71 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk):: pun, pvn, pwn ! 3 ocean velocity components72 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb, ptn ! before andnow tracer fields73 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta! tracer trend74 !! * Local declarations64 !! 65 INTEGER , INTENT(in ) :: kt ! ocean time-step index 66 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 67 INTEGER , INTENT(in ) :: kjpt ! number of tracers 68 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 69 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 70 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before & now tracer fields 71 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 72 !! 75 73 INTEGER :: ji, jj, jk, jn ! dummy loop indices 76 REAL(wp) :: zu, z0u, zzwx 77 REAL(wp) :: zv, z0v, zzwy 78 REAL(wp) :: zw, z0w 74 REAL(wp) :: zu, z0u, zzwx ! local scalar 75 REAL(wp) :: zv, z0v, zzwy ! - - 76 REAL(wp) :: zw, z0w ! - - 79 77 REAL(wp) :: ztra, zbtr, zdt, zalpha 80 78 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zslpx, zslpy ! 3D workspace 81 79 !!---------------------------------------------------------------------- 82 80 83 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 )) THEN81 IF( kt == nit000 ) THEN 84 82 WRITE(numout,*) 85 83 WRITE(numout,*) 'tra_adv_muscl2 : MUSCL2 advection scheme on ', cdtype … … 90 88 ENDIF 91 89 92 ! 90 ! ! =========== 93 91 DO jn = 1, kjpt ! tracer loop 94 92 ! ! =========== … … 181 179 END DO 182 180 END DO 183 184 ! ! lateral boundary conditions on zwx, zwy (changed sign) 185 CALL lbc_lnk( zwx, 'U', -1. ) ; CALL lbc_lnk( zwy, 'V', -1. ) 181 CALL lbc_lnk( zwx, 'U', -1. ) ; CALL lbc_lnk( zwy, 'V', -1. ) ! lateral boundary condition (changed sign) 182 186 183 ! Tracer flux divergence at t-point added to the general trend 187 184 DO jk = 1, jpkm1 … … 278 275 END DO 279 276 END DO 280 281 ! Compute & add the vertical advective trend 282 DO jk = 1, jpkm1 277 ! 278 DO jk = 1, jpkm1 ! Compute & add the vertical advective trend 283 279 DO jj = 2, jpjm1 284 280 DO ji = fs_2, fs_jpim1 ! vector opt. … … 291 287 END DO 292 288 END DO 293 294 ! Save the vertical advective trends for diagnostic 295 ! ------------------------------------------------- 296 ! ! trend diagnostics (contribution of upstream fluxes) 289 ! ! trend diagnostics (contribution of upstream fluxes) 297 290 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_trd_zad, zwx, pwn, ptb(:,:,:,jn) ) 298 291 ! 299 END DO292 END DO 300 293 ! 301 294 END SUBROUTINE tra_adv_muscl2 -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traadv_qck.F90
r2083 r2104 9 9 10 10 !!---------------------------------------------------------------------- 11 !! tra_adv_qck 12 !! 13 !! tra_adv_qck_i : 14 !! tra_adv_qck_j : 11 !! tra_adv_qck : update the tracer trend with the horizontal advection 12 !! trends using a 3rd order finite difference scheme 13 !! tra_adv_qck_i : apply QUICK scheme in i-direction 14 !! tra_adv_qck_j : apply QUICK scheme in j-direction 15 15 !! tra_adv_cen2_k : 2nd centered scheme for the vertical advection 16 16 !!---------------------------------------------------------------------- 17 17 USE oce ! ocean dynamics and active tracers 18 18 USE dom_oce ! ocean space and time domain 19 USE trdmod_oce 20 USE trdtra ! ocean tracers trends19 USE trdmod_oce ! ocean space and time domain 20 USE trdtra ! ocean tracers trends 21 21 USE trabbl ! advective term in the BBL 22 22 USE lib_mpp ! distribued memory computing … … 32 32 PUBLIC tra_adv_qck ! routine called by step.F90 33 33 34 REAL(wp) :: r1_6 = 1./ 6.35 LOGICAL :: l_trd ! flag to compute trends34 LOGICAL :: l_trd ! flag to compute trends 35 REAL(wp) :: r1_6 = 1./ 6. ! 1/6 ratio 36 36 37 37 !! * Substitutions … … 40 40 !!---------------------------------------------------------------------- 41 41 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 42 !! $Id: traadv_qck.F90 2024 2010-07-29 10:57:35Z cetlod$42 !! $Id: $ 43 43 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 44 44 !!---------------------------------------------------------------------- … … 83 83 !!---------------------------------------------------------------------- 84 84 !! 85 INTEGER , INTENT(in ):: kt ! ocean time-step index86 CHARACTER(len=3) , INTENT(in ):: cdtype ! =TRA or TRC (tracer indicator)87 INTEGER , INTENT(in ):: kjpt ! number of tracers88 REAL(wp) , INTENT(in ), DIMENSION(jpk):: p2dt ! vertical profile of tracer time-step89 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk):: pun, pvn, pwn ! 3 ocean velocity components90 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt):: ptb, ptn ! before and now tracer fields91 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta! tracer trend92 !!---------------------------------------------------------------------- 93 94 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 )) THEN85 INTEGER , INTENT(in ) :: kt ! ocean time-step index 86 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 87 INTEGER , INTENT(in ) :: kjpt ! number of tracers 88 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 89 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 90 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 91 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 92 !!---------------------------------------------------------------------- 93 94 IF( kt == nit000 ) THEN 95 95 IF(lwp) WRITE(numout,*) 96 96 IF(lwp) WRITE(numout,*) 'tra_adv_qck : 3rd order quickest advection scheme on ', cdtype … … 103 103 104 104 ! I. The horizontal fluxes are computed with the QUICKEST + ULTIMATE scheme 105 !---------------------------------------------------------------------------106 107 105 CALL tra_adv_qck_i( kt, cdtype, p2dt, pun, ptb, ptn, pta, kjpt ) 108 106 CALL tra_adv_qck_j( kt, cdtype, p2dt, pvn, ptb, ptn, pta, kjpt ) 109 107 110 108 ! II. The vertical fluxes are computed with the 2nd order centered scheme 111 !-------------------------------------------------------------------------112 !113 109 CALL tra_adv_cen2_k( kt, cdtype, pwn, ptn, pta, kjpt ) 114 110 ! 115 111 END SUBROUTINE tra_adv_qck 116 112 113 117 114 SUBROUTINE tra_adv_qck_i( kt, cdtype, p2dt, pun, & 118 115 & ptb, ptn, pta, kjpt ) … … 122 119 USE oce , zwx => ua ! use ua as workspace 123 120 !! 124 INTEGER , INTENT(in ):: kt ! ocean time-step index125 CHARACTER(len=3) , INTENT(in ):: cdtype ! =TRA or TRC (tracer indicator)126 INTEGER , INTENT(in ):: kjpt ! number of tracers127 REAL(wp) , INTENT(in ), DIMENSION(jpk):: p2dt ! vertical profile of tracer time-step128 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk) :: pun ! zonal velocity component129 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb, ptn ! beforetracer fields130 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta! tracer trend121 INTEGER , INTENT(in ) :: kt ! ocean time-step index 122 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 123 INTEGER , INTENT(in ) :: kjpt ! number of tracers 124 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 125 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun ! i-velocity components 126 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 127 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 131 128 !! 132 129 INTEGER :: ji, jj, jk, jn ! dummy loop indices 133 REAL(wp) :: ztra, zbtr ! temporaryscalars134 REAL(wp) :: zdir, zdx, zdt, zmsk ! temporaryscalars135 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zfu, zfc, zfd 130 REAL(wp) :: ztra, zbtr ! local scalars 131 REAL(wp) :: zdir, zdx, zdt, zmsk ! local scalars 132 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zfu, zfc, zfd ! 3D wokspace 136 133 !---------------------------------------------------------------------- 137 134 138 135 ! ! =========== 139 136 DO jn = 1, kjpt ! tracer loop 140 137 ! ! =========== … … 154 151 END DO 155 152 END DO 156 ! 157 !--- Lateral boundary conditions 158 CALL lbc_lnk( zfc(:,:,:), 'T', 1. ) ; CALL lbc_lnk( zfd(:,:,:), 'T', 1. ) 153 CALL lbc_lnk( zfc(:,:,:), 'T', 1. ) ; CALL lbc_lnk( zfd(:,:,:), 'T', 1. ) ! Lateral boundary conditions 154 159 155 160 156 ! … … 182 178 END DO 183 179 END DO 184 END DO ! 185 180 END DO 186 181 !--- Lateral boundary conditions 187 CALL lbc_lnk( zfu(:,:,:), 'T', 1. ) ;CALL lbc_lnk( zfd(:,:,:), 'T', 1. )188 CALL lbc_lnk( zfc(:,:,:), 'T', 1. ) ;CALL lbc_lnk( zwx(:,:,:), 'T', 1. )182 CALL lbc_lnk( zfu(:,:,:), 'T', 1. ) ; CALL lbc_lnk( zfd(:,:,:), 'T', 1. ) 183 CALL lbc_lnk( zfc(:,:,:), 'T', 1. ) ; CALL lbc_lnk( zwx(:,:,:), 'T', 1. ) 189 184 190 185 !--- QUICKEST scheme … … 199 194 END DO 200 195 END DO 201 !---Lateral boundary conditions202 CALL lbc_lnk( zfu(:,:,:), 'T', 1. ) 196 CALL lbc_lnk( zfu(:,:,:), 'T', 1. ) ! Lateral boundary conditions 197 203 198 ! 204 199 ! Tracer flux on the x-direction … … 235 230 END SUBROUTINE tra_adv_qck_i 236 231 232 237 233 SUBROUTINE tra_adv_qck_j( kt, cdtype, p2dt, pvn, & 238 234 & ptb, ptn, pta, kjpt ) … … 243 239 USE oce , zwy => ua ! use ua as workspace 244 240 !! 245 INTEGER , INTENT(in ):: kt ! ocean time-step index246 CHARACTER(len=3) , INTENT(in ):: cdtype ! =TRA or TRC (tracer indicator)247 INTEGER , INTENT(in ):: kjpt ! number of tracers248 REAL(wp) , INTENT(in ), DIMENSION(jpk):: p2dt ! vertical profile of tracer time-step249 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk) :: pvn ! meridional velocity component250 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb, ptn ! beforetracer fields251 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta! tracer trend241 INTEGER , INTENT(in ) :: kt ! ocean time-step index 242 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 243 INTEGER , INTENT(in ) :: kjpt ! number of tracers 244 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 245 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pvn ! j-velocity components 246 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 247 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 252 248 !! 253 249 INTEGER :: ji, jj, jk, jn ! dummy loop indices 254 REAL(wp) :: ztra, zbtr ! temporaryscalars255 REAL(wp) :: zdir, zdx, zdt, zmsk ! temporaryscalars256 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zfu, zfc, zfd 250 REAL(wp) :: ztra, zbtr ! local scalars 251 REAL(wp) :: zdir, zdx, zdt, zmsk ! local scalars 252 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zfu, zfc, zfd ! 3D wokspace 257 253 !---------------------------------------------------------------------- 258 254 255 ! ! =========== 259 256 DO jn = 1, kjpt ! tracer loop 260 257 ! ! =========== … … 274 271 END DO 275 272 END DO 276 ! 277 !--- Lateral boundary conditions 278 CALL lbc_lnk( zfc(:,:,:), 'T', 1. ) ; CALL lbc_lnk( zfd(:,:,:), 'T', 1. ) 273 CALL lbc_lnk( zfc(:,:,:), 'T', 1. ) ; CALL lbc_lnk( zfd(:,:,:), 'T', 1. ) ! Lateral boundary conditions 274 279 275 280 276 ! … … 302 298 END DO 303 299 END DO 304 END DO !300 END DO 305 301 306 302 !--- Lateral boundary conditions … … 357 353 ! 358 354 END DO 359 355 ! 360 356 END SUBROUTINE tra_adv_qck_j 357 361 358 362 359 SUBROUTINE tra_adv_cen2_k( kt, cdtype, pwn, & … … 365 362 !! 366 363 !!---------------------------------------------------------------------- 367 !!368 364 USE oce , zwz => ua ! use ua as workspace 369 365 !! 370 INTEGER , INTENT(in ):: kt ! ocean time-step index371 CHARACTER(len=3) , INTENT(in ):: cdtype ! =TRA or TRC (tracer indicator)372 INTEGER , INTENT(in ):: kjpt ! number of tracers373 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk) :: pwn ! vertical velocity component374 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptn ! now tracer field375 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta! tracer trend366 INTEGER , INTENT(in ) :: kt ! ocean time-step index 367 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 368 INTEGER , INTENT(in ) :: kjpt ! number of tracers 369 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pwn ! vertical velocity 370 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptn ! before and now tracer fields 371 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 376 372 !! 377 373 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 379 375 !!---------------------------------------------------------------------- 380 376 381 ! 377 ! ! =========== 382 378 DO jn = 1, kjpt ! tracer loop 383 379 ! ! =========== … … 424 420 !! ** Method : 425 421 !!---------------------------------------------------------------------- 426 REAL(wp), INTENT(in) , DIMENSION(jpi,jpj,jpk) ::pfu ! second upwind point427 REAL(wp), INTENT(in) , DIMENSION(jpi,jpj,jpk) ::pfd ! first douwning point428 REAL(wp), INTENT(in) , DIMENSION(jpi,jpj,jpk) ::pfc ! the central point (or the first upwind point)429 REAL(wp), INTENT(inout) , DIMENSION(jpi,jpj,jpk) ::puc ! input as Courant number ; output as flux422 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pfu ! second upwind point 423 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pfd ! first douwning point 424 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pfc ! the central point (or the first upwind point) 425 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: puc ! input as Courant number ; output as flux 430 426 !! 431 427 INTEGER :: ji, jj, jk ! dummy loop indices 432 REAL(wp) :: zcoef1, zcoef2, zcoef3 ! temporaryscalars433 REAL(wp) :: zc, zcurv, zfho ! 428 REAL(wp) :: zcoef1, zcoef2, zcoef3 ! local scalars 429 REAL(wp) :: zc, zcurv, zfho ! - - 434 430 !---------------------------------------------------------------------- 435 431 … … 460 456 ENDIF 461 457 puc(ji,jj,jk) = zfho 462 END DO463 END DO464 END DO458 END DO 459 END DO 460 END DO 465 461 ! 466 462 END SUBROUTINE quickest -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traadv_tvd.F90
r2083 r2104 4 4 !! Ocean tracers: horizontal & vertical advective trend 5 5 !!============================================================================== 6 !! History : ! 95-12 (L. Mortier) Original code 7 !! ! 00-01 (H. Loukos) adapted to ORCA 8 !! ! 00-10 (MA Foujols E.Kestenare) include file not routine 9 !! ! 00-12 (E. Kestenare M. Levy) fix bug in trtrd indexes 10 !! ! 01-07 (E. Durand G. Madec) adaptation to ORCA config 11 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 12 !! 9.0 ! 04-01 (A. de Miranda, G. Madec, J.M. Molines ): advective bbl 13 !! 9.0 ! 08-04 (S. Cravatte) add the i-, j- & k- trends computation 14 !! " " ! 09-11 (V. Garnier) Surface pressure gradient organization 15 !! 3.3 ! 10-05 (C. Ethe, G. Madec) merge TRC-TRA + switch from velocity to transport 16 !!---------------------------------------------------------------------- 17 6 !! History : OPA ! 1995-12 (L. Mortier) Original code 7 !! ! 2000-01 (H. Loukos) adapted to ORCA 8 !! ! 2000-10 (MA Foujols E.Kestenare) include file not routine 9 !! ! 2000-12 (E. Kestenare M. Levy) fix bug in trtrd indexes 10 !! ! 2001-07 (E. Durand G. Madec) adaptation to ORCA config 11 !! 8.5 ! 2002-06 (G. Madec) F90: Free form and module 12 !! NEMO 1.0 ! 2004-01 (A. de Miranda, G. Madec, J.M. Molines ): advective bbl 13 !! 2.0 ! 2008-04 (S. Cravatte) add the i-, j- & k- trends computation 14 !! - ! 2009-11 (V. Garnier) Surface pressure gradient organization 15 !! 3.3 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA + switch from velocity to transport 16 !!---------------------------------------------------------------------- 18 17 19 18 !!---------------------------------------------------------------------- … … 53 52 CONTAINS 54 53 55 SUBROUTINE tra_adv_tvd ( kt, cdtype, p2dt, pun, pvn, pwn, &54 SUBROUTINE tra_adv_tvd ( kt, cdtype, p2dt, pun, pvn, pwn, & 56 55 & ptb, ptn, pta, kjpt ) 57 56 !!---------------------------------------------------------------------- … … 71 70 USE oce , zwy => va ! use va as workspace 72 71 !! 73 INTEGER , INTENT(in ) :: kt ! ocean time-step index 74 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 75 INTEGER , INTENT(in ) :: kjpt ! number of tracers 76 REAL(wp) , INTENT(in ), DIMENSION(jpk) :: p2dt ! vertical profile of tracer time-step 77 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk) :: pun, pvn, pwn ! 3 ocean velocity components 78 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb, ptn ! before and now tracer fields 79 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta ! tracer trend 80 !! 81 INTEGER :: ji, jj, jk, jn ! dummy loop indices 82 REAL(wp) :: & 83 z2dtt, zbtr, ztra, & ! temporary scalar 84 zfp_ui, zfp_vj, zfp_wk, & ! " " 85 zfm_ui, zfm_vj, zfm_wk ! " " 86 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zwi, zwz ! temporary workspace 87 REAL(wp), DIMENSION (:,:,:), ALLOCATABLE :: ztrdx, ztrdy, ztrdz 88 !!---------------------------------------------------------------------- 89 90 91 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 ) ) THEN 72 INTEGER , INTENT(in ) :: kt ! ocean time-step index 73 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 74 INTEGER , INTENT(in ) :: kjpt ! number of tracers 75 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 76 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 77 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 78 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 79 !! 80 INTEGER :: ji, jj, jk, jn ! dummy loop indices 81 REAL(wp) :: z2dtt, zbtr, ztra ! local scalar 82 REAL(wp) :: zfp_ui, zfp_vj, zfp_wk ! - - 83 REAL(wp) :: zfm_ui, zfm_vj, zfm_wk ! - - 84 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zwi, zwz ! 3D workspace 85 REAL(wp), DIMENSION (:,:,:), ALLOCATABLE :: ztrdx, ztrdy, ztrdz 86 !!---------------------------------------------------------------------- 87 88 IF( kt == nit000 ) THEN 92 89 WRITE(numout,*) 93 90 WRITE(numout,*) 'tra_adv_tvd : TVD advection scheme on ', cdtype … … 99 96 ! 100 97 IF( l_trd ) THEN 101 ALLOCATE( ztrdx(jpi,jpj,jpk) ) ; ztrdx(:,:,:) = 0. 102 ALLOCATE( ztrdy(jpi,jpj,jpk) ) ; ztrdy(:,:,:) = 0. 103 ALLOCATE( ztrdz(jpi,jpj,jpk) ) ; ztrdz(:,:,:) = 0. 98 ALLOCATE( ztrdx(jpi,jpj,jpk) ) ; ztrdx(:,:,:) = 0.e0 99 ALLOCATE( ztrdy(jpi,jpj,jpk) ) ; ztrdy(:,:,:) = 0.e0 100 ALLOCATE( ztrdz(jpi,jpj,jpk) ) ; ztrdz(:,:,:) = 0.e0 104 101 END IF 105 102 ! … … 190 187 191 188 ! antidiffusive flux on k 192 ! Surface value 193 zwz(:,:,1) = 0.e0 194 ! Interior value 195 DO jk = 2, jpkm1 189 zwz(:,:,1) = 0.e0 ! Surface value 190 ! 191 DO jk = 2, jpkm1 ! Interior value 196 192 DO jj = 1, jpj 197 193 DO ji = 1, jpi … … 200 196 END DO 201 197 END DO 202 203 ! Lateral bondary conditions 204 CALL lbc_lnk( zwx, 'U', -1. ) 205 CALL lbc_lnk( zwy, 'V', -1. ) 198 CALL lbc_lnk( zwx, 'U', -1. ) ; CALL lbc_lnk( zwy, 'V', -1. ) ! Lateral bondary conditions 206 199 CALL lbc_lnk( zwz, 'W', 1. ) 207 200 … … 265 258 !! in-space based differencing for fluid 266 259 !!---------------------------------------------------------------------- 267 REAL(wp), DIMENSION(jpk) , INTENT( in ) :: & 268 p2dt ! vertical profile of tracer time-step 269 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT( in ) :: & 270 pbef, & ! before field 271 paft ! after field 272 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT( inout ) :: & 273 paa, & ! monotonic flux in the i direction 274 pbb, & ! monotonic flux in the j direction 275 pcc ! monotonic flux in the k direction 260 REAL(wp), DIMENSION(jpk) , INTENT(in ) :: p2dt ! vertical profile of tracer time-step 261 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in ) :: pbef, paft ! before & after field 262 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(inout) :: paa, pbb, pcc ! monotonic fluxes in the 3 directions 276 263 !! 277 264 INTEGER :: ji, jj, jk ! dummy loop indices … … 332 319 END DO 333 320 END DO 334 335 ! lateral boundary condition on zbetup & zbetdo (unchanged sign) 336 CALL lbc_lnk( zbetup, 'T', 1. ) 337 CALL lbc_lnk( zbetdo, 'T', 1. ) 321 CALL lbc_lnk( zbetup, 'T', 1. ) ; CALL lbc_lnk( zbetdo, 'T', 1. ) ! lateral boundary cond. (unchanged sign) 322 338 323 339 324 … … 362 347 END DO 363 348 END DO 364 365 ! lateral boundary condition on paa, pbb, pcc 366 CALL lbc_lnk( paa, 'U', -1. ) ! changed sign 367 CALL lbc_lnk( pbb, 'V', -1. ) ! changed sign 349 CALL lbc_lnk( paa, 'U', -1. ) ; CALL lbc_lnk( pbb, 'V', -1. ) ! lateral boundary condition (changed sign) 368 350 ! 369 351 END SUBROUTINE nonosc -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traadv_ubs.F90
r2083 r2104 5 5 !!============================================================================== 6 6 !! History : 1.0 ! 2006-08 (L. Debreu, R. Benshila) Original code 7 !!3.3 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA + switch from velocity to transport7 !! 3.3 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA + switch from velocity to transport 8 8 !!---------------------------------------------------------------------- 9 9 … … 41 41 CONTAINS 42 42 43 SUBROUTINE tra_adv_ubs ( kt, cdtype, p2dt, pun, pvn, pwn, &43 SUBROUTINE tra_adv_ubs ( kt, cdtype, p2dt, pun, pvn, pwn, & 44 44 & ptb, ptn, pta, kjpt ) 45 45 !!---------------------------------------------------------------------- … … 74 74 !! Farrow, D.E., Stevens, D.P., 1995, J. Phys. Ocean. 25, 1731Ð1741. 75 75 !!---------------------------------------------------------------------- 76 !!* Module used77 76 USE oce , zwx => ua ! use ua as workspace 78 77 USE oce , zwy => va ! use va as workspace 79 !! * Arguments80 INTEGER , INTENT(in ):: kt ! ocean time-step index81 CHARACTER(len=3) , INTENT(in ):: cdtype ! =TRA or TRC (tracer indicator)82 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk) :: pun, pvn, pwn ! 3 ocean velocity components83 INTEGER , INTENT(in ) :: kjpt ! number of tracers84 REAL(wp) , INTENT(in ), DIMENSION(jpk) :: p2dt ! vertical profile of tracer time-step85 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt):: ptb, ptn ! before and now tracer fields86 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta! tracer trend87 !! * Local declarations78 !! 79 INTEGER , INTENT(in ) :: kt ! ocean time-step index 80 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 81 INTEGER , INTENT(in ) :: kjpt ! number of tracers 82 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 83 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 84 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 85 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 86 !! 88 87 INTEGER :: ji, jj, jk, jn ! dummy loop indices 89 REAL(wp) :: ztra, zbtr, zcoef ! temporary scalars 90 REAL(wp) :: zfp_ui, zfm_ui, zcenut ! " " 91 REAL(wp) :: zfp_vj, zfm_vj, zcenvt ! " " ! " " 92 REAL(wp) :: z2dtt 93 REAL(wp) :: ztak, zfp_wk, zfm_wk ! " " 94 REAL(wp) :: zeeu, zeev, z_hdivn 95 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztu, ztv, zltu , zltv ! " " 96 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zti, ztw ! " " 97 !!---------------------------------------------------------------------- 98 99 100 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 ) ) THEN 88 REAL(wp) :: ztra, zbtr, zcoef ! local scalars 89 REAL(wp) :: zfp_ui, zfm_ui, zcenut ! - - 90 REAL(wp) :: zfp_vj, zfm_vj, zcenvt ! - - 91 REAL(wp) :: z2dtt ! - - 92 REAL(wp) :: ztak, zfp_wk, zfm_wk ! - - 93 REAL(wp) :: zeeu, zeev, z_hdivn ! - - 94 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztu, ztv, zltu , zltv ! 3D workspace 95 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zti, ztw ! - - 96 !!---------------------------------------------------------------------- 97 98 IF( kt == nit000 ) THEN 101 99 IF(lwp) WRITE(numout,*) 102 100 IF(lwp) WRITE(numout,*) 'tra_adv_ubs : horizontal UBS advection scheme on ', cdtype … … 113 111 ! ---------------------------------- 114 112 zltu(:,:,jpk) = 0.e0 ; zltv(:,:,jpk) = 0.e0 115 ! ! ===============113 ! 116 114 DO jk = 1, jpkm1 ! Horizontal slab 117 ! ! ===============115 ! 118 116 ! Laplacian 119 ! First derivative (gradient) 120 DO jj = 1, jpjm1 117 DO jj = 1, jpjm1 ! First derivative (gradient) 121 118 DO ji = 1, fs_jpim1 ! vector opt. 122 119 zeeu = e2u(ji,jj) * fse3u(ji,jj,jk) / e1u(ji,jj) * umask(ji,jj,jk) … … 126 123 END DO 127 124 END DO 128 ! Second derivative (divergence) 129 DO jj = 2, jpjm1 125 DO jj = 2, jpjm1 ! Second derivative (divergence) 130 126 DO ji = fs_2, fs_jpim1 ! vector opt. 131 127 zcoef = 1. / ( 6. * fse3t(ji,jj,jk) ) … … 134 130 END DO 135 131 END DO 136 ! ! ================= 137 END DO ! End of slab 138 ! ! ================= 139 140 ! Lateral boundary conditions on the laplacian (zlt) (unchanged sgn) 141 CALL lbc_lnk( zltu, 'T', 1. ) ; CALL lbc_lnk( zltv, 'T', 1. ) 132 ! 133 END DO ! End of slab 134 CALL lbc_lnk( zltu, 'T', 1. ) ; CALL lbc_lnk( zltv, 'T', 1. ) ! Lateral boundary cond. (unchanged sgn) 142 135 143 136 ! 144 137 ! Horizontal advective fluxes 145 DO jk = 1, jpkm1 138 DO jk = 1, jpkm1 ! Horizontal slab 146 139 DO jj = 1, jpjm1 147 140 DO ji = 1, fs_jpim1 ! vector opt. … … 159 152 END DO 160 153 END DO 161 END DO154 END DO ! End of slab 162 155 163 156 zltu(:,:,:) = pta(:,:,:,jn) ! store pta trends … … 176 169 END DO 177 170 END DO 178 ! ! ===============171 ! 179 172 END DO ! End of slab 180 ! ! ===============181 173 182 174 ! Horizontal trend used in tra_adv_ztvd subroutine … … 286 278 END SUBROUTINE tra_adv_ubs 287 279 280 288 281 SUBROUTINE nonosc_z( pbef, pcc, paft, p2dt ) 289 282 !!--------------------------------------------------------------------- … … 299 292 !! in-space based differencing for fluid 300 293 !!---------------------------------------------------------------------- 301 REAL(wp), INTENT(in ), DIMENSION(jpk) :: p2dt 294 REAL(wp), INTENT(in ), DIMENSION(jpk) :: p2dt ! vertical profile of tracer time-step 302 295 REAL(wp), DIMENSION (jpi,jpj,jpk) :: pbef ! before field 303 296 REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) :: paft ! after field -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/trabbc.F90
r2024 r2104 194 194 WRITE(*,*) 'tra_bbc: You should not have seen this print! error?', kt 195 195 END SUBROUTINE tra_bbc 196 SUBROUTINE tra_bbc_init ! Empty routine 197 END SUBROUTINE tra_bbc_init 196 198 #endif 197 199 -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/trabbl.F90
r2082 r2104 26 26 USE phycst ! 27 27 USE eosbn2 ! equation of state 28 USE trdmod_oce 29 USE trdtra ! ocean active tracers trends28 USE trdmod_oce ! ocean space and time domain 29 USE trdtra ! ocean active tracers trends 30 30 USE iom ! IOM server 31 31 USE in_out_manager ! I/O manager 32 32 USE lbclnk ! ocean lateral boundary conditions 33 33 USE prtctl ! Print control 34 USE trc_oce 34 USE trc_oce ! share passive tracers/Ocean variables 35 35 36 36 IMPLICIT NONE … … 49 49 # endif 50 50 51 LOGICAL, PUBLIC :: l_bbl !: flag to compute bbl diffu. flux coef and transport 52 51 53 ! !!* Namelist nambbl * 52 54 INTEGER , PUBLIC :: nn_bbl_ldf = 0 !: =1 : diffusive bbl or not (=0) … … 57 59 REAL(wp), PUBLIC :: rn_gambbl = 10.e0 !: lateral coeff. for bottom boundary layer scheme [s] 58 60 61 REAL(wp), DIMENSION(jpi,jpj), PUBLIC :: utr_bbl, vtr_bbl ! u- (v-) transport in the bottom boundary layer 62 59 63 INTEGER , DIMENSION(jpi,jpj) :: mbkt ! vertical index of the bottom ocean T-level 60 64 INTEGER , DIMENSION(jpi,jpj) :: mbku , mbkv ! vertical index of the (upper) bottom ocean U/V-level 61 65 INTEGER , DIMENSION(jpi,jpj) :: mbku_d , mbkv_d ! vertical index of the "lower" bottom ocean U/V-level 62 66 INTEGER , DIMENSION(jpi,jpj) :: mgrhu , mgrhv ! = +/-1, sign of grad(H) in u-(v-)direction 63 REAL(wp), DIMENSION(jpi,jpj), PUBLIC :: utr_bbl , vtr_bbl ! u- (v-) transport in the bottom boundary layer64 67 REAL(wp), DIMENSION(jpi,jpj) :: ahu_bbl_0, ahv_bbl_0 ! diffusive bbl flux coefficients at u and v-points 65 68 REAL(wp), DIMENSION(jpi,jpj) :: ahu_bbl , ahv_bbl ! masked diffusive bbl coefficients at u and v-points 66 69 REAL(wp), DIMENSION(jpi,jpj) :: e3u_bbl_0, e3v_bbl_0 ! thichness of the bbl (e3) at u and v-points 67 REAL(wp), DIMENSION(jpi,jpj) :: e1e2t_r ! thichness of the bbl (e3) at u and v-points 68 LOGICAL, PUBLIC :: l_bbl !: flag to compute bbl diffu. flux coef and transport 70 REAL(wp), DIMENSION(jpi,jpj) :: e1e2t_r ! thichness of the bbl (e3) at u and v-points 69 71 70 72 !! * Substitutions … … 73 75 !!---------------------------------------------------------------------- 74 76 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 75 !! $Id$ 77 !! $Id$ 76 78 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 77 79 !!---------------------------------------------------------------------- 78 80 79 81 CONTAINS 80 81 82 82 83 SUBROUTINE tra_bbl( kt ) … … 90 91 !!---------------------------------------------------------------------- 91 92 INTEGER, INTENT( in ) :: kt ! ocean time-step 92 ! 93 !! 93 94 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds 94 95 !!---------------------------------------------------------------------- … … 154 155 !! convection is satified) 155 156 !! 156 !!157 157 !! References : Beckmann, A., and R. Doscher, 1997, J. Phys.Oceanogr., 581-591. 158 158 !! Campin, J.-M., and H. Goosse, 1999, Tellus, 412-430. 159 159 !!---------------------------------------------------------------------- 160 !!* Arguments 161 INTEGER , INTENT(in ) :: kjpt ! number of tracers 162 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptrab ! before and now tracer fields 163 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptraa ! tracer trend 160 INTEGER , INTENT(in ) :: kjpt ! number of tracers 161 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptrab ! before and now tracer fields 162 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: ptraa ! tracer trend 163 !! 164 INTEGER :: ji, jj, jn ! dummy loop indices 165 INTEGER :: ik ! local integer 166 REAL(wp) :: zbtr, ztra ! local scalars 167 REAL(wp), DIMENSION(jpi,jpj) :: ztrb, zkx, zky ! 2D workspace 168 !!---------------------------------------------------------------------- 164 169 ! 165 INTEGER :: ji, jj, jn ! dummy loop indices 166 INTEGER :: ik ! temporary integers 167 REAL(wp) :: zbtr, ztra ! temporary 168 REAL(wp), DIMENSION(jpi,jpj) :: ztrb, zkx, zky ! 2D workspace 169 !!---------------------------------------------------------------------- 170 ! =========== 170 ! ! =========== 171 171 DO jn = 1, kjpt ! tracer loop 172 172 ! ! =========== … … 183 183 END DO 184 184 ! 185 !!gm forced unrolling should be uuseless in the loop below (no indirect adressing) 185 186 # if defined key_vectopt_loop 186 187 DO jj = 1, 1 ! vector opt. (forced unrolling) … … 212 213 ! 213 214 END SUBROUTINE tra_bbl_dif 215 214 216 215 217 SUBROUTINE tra_bbl_adv( ptrab, ptraa, kjpt ) … … 233 235 !! 234 236 !!---------------------------------------------------------------------- 235 !!* Arguments 236 INTEGER , INTENT(in ) :: kjpt ! number of tracers 237 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptrab ! before and now tracer fields 238 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptraa ! tracer trend 239 ! 237 INTEGER , INTENT(in ) :: kjpt ! number of tracers 238 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptrab ! before and now tracer fields 239 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: ptraa ! tracer trend 240 !! 240 241 INTEGER :: ji, jj, jk, jn ! dummy loop indices 241 INTEGER :: ik ! temporaryintegers242 INTEGER :: iis , iid , ijs , ijd ! --243 INTEGER :: ikus, ikud, ikvs, ikvd ! --244 REAL(wp) :: zbtr, ztra ! - -245 REAL(wp) :: zu_bbl, zv_bbl ! --242 INTEGER :: ik ! local integers 243 INTEGER :: iis , iid , ijs , ijd ! - - 244 INTEGER :: ikus, ikud, ikvs, ikvd ! - - 245 REAL(wp) :: zbtr, ztra ! local scalars 246 REAL(wp) :: zu_bbl, zv_bbl ! - - 246 247 !!---------------------------------------------------------------------- 247 248 … … 277 278 ptraa(iid,jj,ikud,jn) = ptraa(iid,jj,ikud,jn) + ztra 278 279 ENDIF 280 ! 279 281 IF( vtr_bbl(ji,jj) /= 0.e0 ) THEN ! non-zero j-direction bbl advection 280 282 ! down-slope j/k-indices (deep) & up-slope j/k indices (shelf) … … 306 308 END SUBROUTINE tra_bbl_adv 307 309 310 308 311 SUBROUTINE bbl( kt, cdtype ) 309 312 !!---------------------------------------------------------------------- … … 330 333 !! local density (i.e. referenced at a common local depth). 331 334 !! 332 !!333 335 !! References : Beckmann, A., and R. Doscher, 1997, J. Phys.Oceanogr., 581-591. 334 336 !! Campin, J.-M., and H. Goosse, 1999, Tellus, 412-430. 335 337 !!---------------------------------------------------------------------- 336 INTEGER , INTENT(in ) :: kt ! ocean time-step index 337 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 338 INTEGER , INTENT(in ) :: kt ! ocean time-step index 339 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 340 !! 338 341 INTEGER :: ji, jj ! dummy loop indices 339 INTEGER :: ik ! temporaryintegers340 INTEGER :: iis , iid , ijs , ijd ! --341 INTEGER :: ikus, ikud, ikvs, ikvd ! --342 REAL(wp) :: zsign, zsigna, zgbbl ! temporaryscalars343 REAL(wp) :: zgdrho, zt, zs, zh ! --344 REAL(wp), DIMENSION(jpi,jpj) :: zub, zvb, ztb, zsb, zdep ! - -342 INTEGER :: ik ! local integers 343 INTEGER :: iis , iid , ijs , ijd ! - - 344 INTEGER :: ikus, ikud, ikvs, ikvd ! - - 345 REAL(wp) :: zsign, zsigna, zgbbl ! local scalars 346 REAL(wp) :: zgdrho, zt, zs, zh ! - - 347 REAL(wp), DIMENSION(jpi,jpj) :: zub, zvb, ztb, zsb, zdep ! 2D workspace 345 348 !! 346 349 REAL(wp) :: fsalbt, fsbeta, pft, pfs, pfh ! statement function … … 377 380 !!---------------------------------------------------------------------- 378 381 382 IF( kt == nit000 ) THEN 383 IF(lwp) WRITE(numout,*) 384 IF(lwp) WRITE(numout,*) 'trabbl:bbl : Compute bbl velocities and diffusive coefficients in ', cdtype 385 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 386 ENDIF 387 379 388 ! !* bottom temperature, salinity, velocity and depth 380 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 ) ) THEN381 IF(lwp) WRITE(numout,*) ' '382 IF(lwp) WRITE(numout,*) ' trabbl:bbl : Compute bbl velocities and diffusive coefficients in ', cdtype383 IF(lwp) WRITE(numout,*) ' '384 ENDIF385 386 389 #if defined key_vectopt_loop 387 390 DO jj = 1, 1 ! vector opt. (forced unrolling) … … 392 395 #endif 393 396 ik = mbkt(ji,jj) ! bottom T-level index 394 ztb (ji,jj) = tsb(ji,jj,ik,jp_tem) 397 ztb (ji,jj) = tsb(ji,jj,ik,jp_tem) ! bottom before T and S 395 398 zsb (ji,jj) = tsb(ji,jj,ik,jp_sal) 396 399 zdep(ji,jj) = fsdept_0(ji,jj,ik) ! bottom T-level reference depth … … 440 443 ENDIF 441 444 442 443 445 ! !-------------------! 444 446 IF( nn_bbl_adv /= 0 ) THEN ! advective bbl ! … … 477 479 END DO 478 480 END DO 479 !481 ! 480 482 CASE( 2 ) != bbl velocity = F( delta rho ) 481 483 zgbbl = grav * rn_gambbl … … 531 533 !! 532 534 !! ** Method : Read the nambbl namelist and check the parameters 533 !! called by tra_bbl at the first timestep (nit000)535 !! called by tra_bbl at the first timestep (nit000) 534 536 !!---------------------------------------------------------------------- 535 537 INTEGER :: ji, jj ! dummy loop indices 536 538 INTEGER :: ii0, ii1, ij0, ij1 ! temporary integer 537 539 REAL(wp), DIMENSION(jpi,jpj) :: zmbk ! 2D workspace 538 540 !! 539 541 NAMELIST/nambbl/ nn_bbl_ldf, nn_bbl_adv, rn_ahtbbl, rn_gambbl 540 542 !!---------------------------------------------------------------------- … … 634 636 LOGICAL, PUBLIC, PARAMETER :: lk_trabbl = .FALSE. !: bbl flag 635 637 CONTAINS 636 SUBROUTINE tra_bbl( kt ) ! Empty routine 638 SUBROUTINE tra_bbl_init ! Dummy routine 639 END SUBROUTINE tra_bbl_init 640 SUBROUTINE tra_bbl( kt ) ! Dummy routine 637 641 WRITE(*,*) 'tra_bbl: You should not have seen this print! error?', kt 638 642 END SUBROUTINE tra_bbl -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/tradmp.F90
r2024 r2104 726 726 WRITE(*,*) 'tra_dmp: You should not have seen this print! error?', kt 727 727 END SUBROUTINE tra_dmp 728 SUBROUTINE tra_dmp_init ! Empty routine 729 END SUBROUTINE tra_dmp_init 728 730 #endif 729 731 -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traldf.F90
r2082 r2104 9 9 10 10 !!---------------------------------------------------------------------- 11 !! tra_ldf : update the tracer trend with the lateral diffusion12 !! ldf_ctl: initialization, namelist read, and parameters control13 !! ldf_ano : compute lateral diffusion for constant T-S profiles11 !! tra_ldf : update the tracer trend with the lateral diffusion 12 !! tra_ldf_init : initialization, namelist read, and parameters control 13 !! ldf_ano : compute lateral diffusion for constant T-S profiles 14 14 !!---------------------------------------------------------------------- 15 15 USE oce ! ocean dynamics and tracers … … 37 37 INTEGER :: nldf = 0 ! type of lateral diffusion used defined from ln_traldf_... namlist logicals) 38 38 #if defined key_traldf_ano 39 REAL, DIMENSION(jpi,jpj,jpk) :: t0_ldf, s0_ldf ! lateral diffusion trends of T & S 40 ! ! for a constant vertical profile 39 REAL, DIMENSION(jpi,jpj,jpk) :: t0_ldf, s0_ldf ! lateral diffusion trends of T & S for a constant profile 41 40 #endif 42 41 … … 73 72 CASE ( 1 ) ; CALL tra_ldf_iso ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts, ahtb0 ) ! rotated laplacian 74 73 CASE ( 2 ) ; CALL tra_ldf_bilap ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts ) ! iso-level bilaplacian 75 CASE ( 3 ) ; CALL tra_ldf_bilapg( kt, 'TRA', tsb, tsa, jpts ) ! s-coord. horizontal bilap lacian74 CASE ( 3 ) ; CALL tra_ldf_bilapg( kt, 'TRA', tsb, tsa, jpts ) ! s-coord. horizontal bilap. 76 75 ! 77 76 CASE ( -1 ) ! esopa: test all possibility with control print -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traldf_bilap.F90
r2082 r2104 4 4 !! Ocean tracers: horizontal component of the lateral tracer mixing trend 5 5 !!============================================================================== 6 !! History : !91-11 (G. Madec) Original code7 !! !93-03 (M. Guyon) symetrical conditions8 !! !95-11 (G. Madec) suppress volumetric scale factors9 !! !96-01 (G. Madec) statement function for e310 !! !96-01 (M. Imbard) mpp exchange11 !! !97-07 (G. Madec) optimization, and ahtt12 !! 8.5 !02-08 (G. Madec) F90: Free form and module13 !! 9.0 !04-08 (C. Talandier) New trends organization14 !! !05-11 (G. Madec) zps or sco as default option15 !! 3.3 !10-05 (C. Ethe, G. Madec) merge TRC-TRA6 !! History : OPA ! 1991-11 (G. Madec) Original code 7 !! ! 1993-03 (M. Guyon) symetrical conditions 8 !! ! 1995-11 (G. Madec) suppress volumetric scale factors 9 !! ! 1996-01 (G. Madec) statement function for e3 10 !! ! 1996-01 (M. Imbard) mpp exchange 11 !! ! 1997-07 (G. Madec) optimization, and ahtt 12 !! 8.5 ! 2002-08 (G. Madec) F90: Free form and module 13 !! NEMO 1.0 ! 2004-08 (C. Talandier) New trends organization 14 !! - ! 2005-11 (G. Madec) zps or sco as default option 15 !! 3.3 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA 16 16 !!============================================================================== 17 17 … … 20 20 !! using a iso-level biharmonic operator 21 21 !!---------------------------------------------------------------------- 22 !! * Modules used23 22 USE oce ! ocean dynamics and active tracers 24 23 USE dom_oce ! ocean space and time domain … … 33 32 PRIVATE 34 33 35 !! * Routine accessibility 36 PUBLIC tra_ldf_bilap ! routine called by step.F90 34 PUBLIC tra_ldf_bilap ! routine called by step.F90 37 35 38 36 !! * Substitutions … … 43 41 !!---------------------------------------------------------------------- 44 42 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 45 !! $Id$ 46 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt43 !! $Id$ 44 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 47 45 !!---------------------------------------------------------------------- 48 46 … … 80 78 USE oce , ztv => va ! use va as workspace 81 79 !! 82 INTEGER , INTENT(in ) :: kt! ocean time-step index83 CHARACTER(len=3) , INTENT(in ) :: cdtype! =TRA or TRC (tracer indicator)84 INTEGER , INTENT(in ) :: kjpt! number of tracers85 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,kjpt ) :: pgu, pgv! tracer gradient at pstep levels86 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb! before and now tracer fields87 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta! tracer trend80 INTEGER , INTENT(in ) :: kt ! ocean time-step index 81 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 82 INTEGER , INTENT(in ) :: kjpt ! number of tracers 83 REAL(wp), DIMENSION(jpi,jpj, kjpt), INTENT(in ) :: pgu, pgv ! tracer gradient at pstep levels 84 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 85 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 88 86 !! 89 INTEGER :: ji, jj, jk, jn ! dummy loop indices 90 INTEGER :: iku, ikv ! temporary integers 91 REAL(wp) :: zbtr, ztra ! temporary scalars 92 REAL(wp), DIMENSION(jpi,jpj) :: & 93 zeeu, zeev, zlt ! 2D workspace 87 INTEGER :: ji, jj, jk, jn ! dummy loop indices 88 INTEGER :: iku, ikv ! local integers 89 REAL(wp) :: zbtr, ztra ! local scalars 90 REAL(wp), DIMENSION(jpi,jpj) :: zeeu, zeev, zlt ! 2D workspace 94 91 !!---------------------------------------------------------------------- 95 92 96 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 )) THEN93 IF( kt == nit000 ) THEN 97 94 IF(lwp) WRITE(numout,*) 98 95 IF(lwp) WRITE(numout,*) 'tra_ldf_bilap : iso-level biharmonic operator on ', cdtype … … 103 100 ! ! =========== 104 101 ! 105 DO jk = 1, jpkm1 102 DO jk = 1, jpkm1 ! Horizontal slab 106 103 ! 107 108 ! 0. Initialization of metric arrays (for z- or s-coordinates) 109 ! ---------------------------------- 104 ! !== Initialization of metric arrays (for z- or s-coordinates) ==! 110 105 DO jj = 1, jpjm1 111 106 DO ji = 1, fs_jpim1 ! vector opt. … … 115 110 END DO 116 111 117 118 ! 1. Laplacian 119 ! ------------ 120 121 ! First derivative (gradient) 122 DO jj = 1, jpjm1 112 ! !== Laplacian ==! 113 ! 114 DO jj = 1, jpjm1 ! First derivative (gradient) 123 115 DO ji = 1, fs_jpim1 ! vector opt. 124 116 ztu(ji,jj,jk) = zeeu(ji,jj) * ( ptb(ji+1,jj ,jk,jn) - ptb(ji,jj,jk,jn) ) … … 126 118 END DO 127 119 END DO 128 IF( ln_zps ) THEN ! set gradient at partial step level120 IF( ln_zps ) THEN ! set gradient at partial step level 129 121 DO jj = 1, jpjm1 130 122 DO ji = 1, jpim1 … … 137 129 END DO 138 130 ENDIF 139 140 ! Second derivative (divergence) multiply by the eddy diffusivity coefficient 141 DO jj = 2, jpjm1 131 DO jj = 2, jpjm1 ! Second derivative (divergence) time the eddy diffusivity coefficient 142 132 DO ji = fs_2, fs_jpim1 ! vector opt. 143 133 zbtr = 1.0 / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 144 zlt(ji,jj) = fsahtt(ji,jj,jk) &145 & * zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) + ztv(ji,jj,jk) - ztv(ji,jj-1,jk))134 zlt(ji,jj) = fsahtt(ji,jj,jk) * zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) & 135 & + ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) 146 136 END DO 147 137 END DO 138 CALL lbc_lnk( zlt, 'T', 1. ) ! Lateral boundary conditions (unchanged sgn) 148 139 149 ! Lateral boundary conditions on the laplacian (zlt) (unchanged sgn) 150 CALL lbc_lnk( zlt, 'T', 1. ) 151 152 ! 2. Bilaplacian 153 ! -------------- 154 155 ! third derivative (gradient) 156 DO jj = 1, jpjm1 140 ! !== Bilaplacian ==! 141 ! 142 DO jj = 1, jpjm1 ! third derivative (gradient) 157 143 DO ji = 1, fs_jpim1 ! vector opt. 158 144 ztu(ji,jj,jk) = zeeu(ji,jj) * ( zlt(ji+1,jj ) - zlt(ji,jj) ) … … 160 146 END DO 161 147 END DO 162 163 ! fourth derivative (divergence) and add to the general tracer trend 164 DO jj = 2, jpjm1 148 DO jj = 2, jpjm1 ! fourth derivative (divergence) and add to the general tracer trend 165 149 DO ji = fs_2, fs_jpim1 ! vector opt. 166 150 ! horizontal diffusive trends … … 171 155 END DO 172 156 END DO 173 ! ! ===============157 ! 174 158 END DO ! Horizontal slab 175 ! ! ===============159 ! 176 160 ! "zonal" mean lateral diffusive heat and salt transport 177 161 IF( cdtype == 'TRA' .AND. ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN … … 179 163 IF( jn == jp_sal ) pst_ldf(:) = ptr_vj( ztv(:,:,:) ) 180 164 ENDIF 181 ! 182 END DO 183 165 ! ! =========== 166 END DO ! tracer loop 167 ! ! =========== 184 168 END SUBROUTINE tra_ldf_bilap 185 169 -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traldf_bilapg.F90
r2082 r2104 16 16 !! ldfght : ??? 17 17 !!---------------------------------------------------------------------- 18 !! * Modules used19 18 USE oce ! ocean dynamics and tracers variables 20 19 USE dom_oce ! ocean space and time domain variables … … 29 28 PRIVATE 30 29 31 !! * Routine accessibility 32 PUBLIC tra_ldf_bilapg ! routine called by step.F90 30 PUBLIC tra_ldf_bilapg ! routine called by step.F90 33 31 34 32 !! * Substitutions … … 38 36 !!---------------------------------------------------------------------- 39 37 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 40 !! $Id$ 38 !! $Id$ 41 39 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt 42 40 !!---------------------------------------------------------------------- … … 68 66 !! biharmonic mixing trend. 69 67 !!---------------------------------------------------------------------- 70 !!* Arguments71 68 INTEGER , INTENT(in ) :: kt ! ocean time-step index 72 69 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 73 70 INTEGER , INTENT(in ) :: kjpt ! number of tracers 74 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt):: ptb ! before and now tracer fields75 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt):: pta ! tracer trend76 !! * Local declarations71 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 72 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 73 !! 77 74 INTEGER :: ji, jj, jk, jn ! dummy loop indices 78 REAL(wp), DIMENSION(jpi,jpj,jpk,SIZE(ptb,4)) :: & 79 wk1, wk2 ! work array used for rotated biharmonic 80 ! ! operator on tracers and/or momentum 81 !!---------------------------------------------------------------------- 82 83 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 ) ) THEN 75 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt) :: wk1, wk2 ! 4D workspace 76 !!---------------------------------------------------------------------- 77 78 IF( kt == nit000 ) THEN 84 79 IF(lwp) WRITE(numout,*) 85 80 IF(lwp) WRITE(numout,*) 'tra_ldf_bilapg : horizontal biharmonic operator in s-coordinate on ', cdtype … … 91 86 ! 1. Laplacian of ptb * aht 92 87 ! ----------------------------- 93 ! rotated harmonic operator applied to ptb and multiply by aht ; output in wk1 94 95 CALL ldfght( kt, cdtype, ptb, wk1, kjpt, 1 ) 96 88 CALL ldfght( kt, cdtype, ptb, wk1, kjpt, 1 ) ! rotated harmonic operator applied to ptb and multiply by aht 89 ! ! output in wk1 97 90 ! 98 91 DO jn = 1, kjpt 99 ! Lateral boundary conditions on wk1 (unchanged sign) 100 CALL lbc_lnk( wk1(:,:,:,jn) , 'T', 1. ) 92 CALL lbc_lnk( wk1(:,:,:,jn) , 'T', 1. ) ! Lateral boundary conditions on wk1 (unchanged sign) 101 93 END DO 102 94 103 95 ! 2. Bilaplacian of ptb 104 96 ! ------------------------- 105 ! rotated harmonic operator applied to wk1 ; output in wk2 106 107 CALL ldfght( kt, cdtype, wk1, wk2, kjpt, 2 ) 97 CALL ldfght( kt, cdtype, wk1, wk2, kjpt, 2 ) ! rotated harmonic operator applied to wk1 ; output in wk2 108 98 109 99 … … 167 157 !! 168 158 !!---------------------------------------------------------------------- 169 !!170 159 USE oce , zftv => ua ! use ua as workspace 171 160 !! -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traldf_iso.F90
r2082 r2104 4 4 !! Ocean tracers: horizontal component of the lateral tracer mixing trend 5 5 !!====================================================================== 6 !! History : 7 !! 8 !! 9 !! 10 !! 3.0 ! 2008-01(C. Ethe, G. Madec) Merge TRA-TRC6 !! History : OPA ! 1994-08 (G. Madec, M. Imbard) 7 !! 8.0 ! 1997-05 (G. Madec) split into traldf and trazdf 8 !! NEMO ! 2002-08 (G. Madec) Free form, F90 9 !! 1.0 ! 2005-11 (G. Madec) merge traldf and trazdf :-) 10 !! 3.3 ! 2010-09 (C. Ethe, G. Madec) Merge TRA-TRC 11 11 !!---------------------------------------------------------------------- 12 12 #if defined key_ldfslp || defined key_esopa 13 13 !!---------------------------------------------------------------------- 14 14 !! 'key_ldfslp' slope of the lateral diffusive direction 15 !!----------------------------------------------------------------------16 15 !!---------------------------------------------------------------------- 17 16 !! tra_ldf_iso : update the tracer trend with the horizontal … … 45 44 !!---------------------------------------------------------------------- 46 45 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 47 !! $Id$ 46 !! $Id$ 48 47 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 49 48 !!---------------------------------------------------------------------- … … 92 91 !! ** Action : Update pta arrays with the before rotated diffusion 93 92 !!---------------------------------------------------------------------- 94 !!* Module used95 93 USE oce , zftu => ua ! use ua as workspace 96 94 USE oce , zftv => va ! use va as workspace 97 !! * Arguments98 INTEGER , INTENT(in ) :: kt! ocean time-step index99 CHARACTER(len=3) , INTENT(in ) :: cdtype! =TRA or TRC (tracer indicator)100 INTEGER , INTENT(in ) :: kjpt! number of tracers101 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,kjpt ) :: pgu, pgv! tracer gradient at pstep levels102 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb! before and now tracer fields103 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta! tracer trend104 REAL(wp) , INTENT(in ) :: pahtb0! background diffusion coef105 !! * Local declarations95 !! 96 INTEGER , INTENT(in ) :: kt ! ocean time-step index 97 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 98 INTEGER , INTENT(in ) :: kjpt ! number of tracers 99 REAL(wp), DIMENSION(jpi,jpj ,kjpt), INTENT(in ) :: pgu, pgv ! tracer gradient at pstep levels 100 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 101 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 102 REAL(wp) , INTENT(in ) :: pahtb0 ! background diffusion coef 103 !! 106 104 INTEGER :: ji, jj, jk,jn ! dummy loop indices 107 INTEGER :: iku, ikv ! temporary integer108 REAL(wp) :: zmsku, zabe1, zcof1, zcoef3 ! temporaryscalars109 REAL(wp) :: zmskv, zabe2, zcof2, zcoef4 ! " "110 REAL(wp) :: zcoef0, zbtr, ztra ! " "105 INTEGER :: iku, ikv ! temporary integer 106 REAL(wp) :: zmsku, zabe1, zcof1, zcoef3 ! local scalars 107 REAL(wp) :: zmskv, zabe2, zcof2, zcoef4 ! - - 108 REAL(wp) :: zcoef0, zbtr, ztra ! - - 111 109 REAL(wp), DIMENSION(jpi,jpj) :: zdkt, zdk1t ! 2D workspace 112 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdit, zdjt, ztfw 110 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdit, zdjt, ztfw ! 3D workspace 113 111 #if defined key_diaar5 114 REAL(wp), DIMENSION(jpi,jpj) :: z2d ! " "115 REAL(wp) :: zztmp ! " "112 REAL(wp), DIMENSION(jpi,jpj) :: z2d ! 2D workspace 113 REAL(wp) :: zztmp ! local scalar 116 114 #endif 117 115 !!---------------------------------------------------------------------- 118 116 119 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 )) THEN117 IF( kt == nit000 ) THEN 120 118 IF(lwp) WRITE(numout,*) 121 119 IF(lwp) WRITE(numout,*) 'tra_ldf_iso : rotated laplacian diffusion operator on ', cdtype … … 159 157 !! II - horizontal trend (full) 160 158 !!---------------------------------------------------------------------- 161 162 159 !CDIR PARALLEL DO PRIVATE( zdk1t ) 163 160 ! ! =============== … … 167 164 ! ------------------------------------------------ 168 165 ! surface boundary condition: zdkt(jk=1)=zdkt(jk=2) 169 170 166 zdk1t(:,:) = ( ptb(:,:,jk,jn) - ptb(:,:,jk+1,jn) ) * tmask(:,:,jk+1) 171 172 IF( jk == 1 ) THEN 173 zdkt(:,:) = zdk1t(:,:) 174 ELSE 175 zdkt(:,:) = ( ptb(:,:,jk-1,jn) - ptb(:,:,jk,jn) ) * tmask(:,:,jk) 167 ! 168 IF( jk == 1 ) THEN ; zdkt(:,:) = zdk1t(:,:) 169 ELSE ; zdkt(:,:) = ( ptb(:,:,jk-1,jn) - ptb(:,:,jk,jn) ) * tmask(:,:,jk) 176 170 ENDIF 177 171 178 179 172 ! 2. Horizontal fluxes 180 ! -------------------- 181 173 ! -------------------- 182 174 DO jj = 1 , jpjm1 183 175 DO ji = 1, fs_jpim1 ! vector opt. 184 176 zabe1 = ( fsahtu(ji,jj,jk) + pahtb0 ) * e2u(ji,jj) * fse3u(ji,jj,jk) / e1u(ji,jj) 185 177 zabe2 = ( fsahtv(ji,jj,jk) + pahtb0 ) * e1v(ji,jj) * fse3v(ji,jj,jk) / e2v(ji,jj) 186 178 ! 187 179 zmsku = 1. / MAX( tmask(ji+1,jj,jk ) + tmask(ji,jj,jk+1) & 188 180 & + tmask(ji+1,jj,jk+1) + tmask(ji,jj,jk ), 1. ) 189 181 ! 190 182 zmskv = 1. / MAX( tmask(ji,jj+1,jk ) + tmask(ji,jj,jk+1) & 191 183 & + tmask(ji,jj+1,jk+1) + tmask(ji,jj,jk ), 1. ) 192 184 ! 193 185 zcof1 = - fsahtu(ji,jj,jk) * e2u(ji,jj) * uslp(ji,jj,jk) * zmsku 194 186 zcof2 = - fsahtv(ji,jj,jk) * e1v(ji,jj) * vslp(ji,jj,jk) * zmskv … … 202 194 END DO 203 195 END DO 204 205 196 206 197 ! II.4 Second derivative (divergence) and add to the general trend … … 216 207 END DO ! End of slab 217 208 ! ! =============== 218 ! "Poleward" diffusive heat or salt transports 209 ! 210 ! "Poleward" diffusive heat or salt transports (T-S case only) 219 211 IF( cdtype == 'TRA' .AND. ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN 220 212 IF( jn == jp_tem) pht_ldf(:) = ptr_vj( zftv(:,:,:) ) … … 229 221 DO jj = 2, jpjm1 230 222 DO ji = fs_2, fs_jpim1 ! vector opt. 231 z2d(ji,jj) = z2d(ji,jj) + zztmp * zftu(ji,jj,jk) &232 &* ( ptn(ji,jj,jk,jn) + ptn(ji+1,jj,jk,jn) ) * e1u(ji,jj) * fse3u(ji,jj,jk)223 z2d(ji,jj) = z2d(ji,jj) + zztmp * zftu(ji,jj,jk) & 224 & * ( ptn(ji,jj,jk,jn) + ptn(ji+1,jj,jk,jn) ) * e1u(ji,jj) * fse3u(ji,jj,jk) 233 225 END DO 234 226 END DO … … 240 232 DO jj = 2, jpjm1 241 233 DO ji = fs_2, fs_jpim1 ! vector opt. 242 z2d(ji,jj) = z2d(ji,jj) + zztmp * zftv(ji,jj,jk) &243 &* ( ptn(ji,jj,jk,jn) + ptn(ji,jj+1,jk,jn) ) * e2v(ji,jj) * fse3v(ji,jj,jk)234 z2d(ji,jj) = z2d(ji,jj) + zztmp * zftv(ji,jj,jk) & 235 & * ( ptn(ji,jj,jk,jn) + ptn(ji,jj+1,jk,jn) ) * e2v(ji,jj) * fse3v(ji,jj,jk) 244 236 END DO 245 237 END DO … … 269 261 DO ji = fs_2, fs_jpim1 ! vector opt. 270 262 zcoef0 = - fsahtw(ji,jj,jk) * tmask(ji,jj,jk) 271 263 ! 272 264 zmsku = 1./MAX( umask(ji ,jj,jk-1) + umask(ji-1,jj,jk) & 273 265 & + umask(ji-1,jj,jk-1) + umask(ji ,jj,jk), 1. ) 274 275 266 zmskv = 1./MAX( vmask(ji,jj ,jk-1) + vmask(ji,jj-1,jk) & 276 267 & + vmask(ji,jj-1,jk-1) + vmask(ji,jj ,jk), 1. ) 277 268 ! 278 269 zcoef3 = zcoef0 * e2t(ji,jj) * zmsku * wslpi (ji,jj,jk) 279 270 zcoef4 = zcoef0 * e1t(ji,jj) * zmskv * wslpj (ji,jj,jk) 280 271 ! 281 272 ztfw(ji,jj,jk) = zcoef3 * ( zdit(ji ,jj ,jk-1) + zdit(ji-1,jj ,jk) & 282 273 & + zdit(ji-1,jj ,jk-1) + zdit(ji ,jj ,jk) ) & … … 290 281 ! I.5 Divergence of vertical fluxes added to the general tracer trend 291 282 ! ------------------------------------------------------------------- 292 293 283 DO jk = 1, jpkm1 294 284 DO jj = 2, jpjm1 -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traldf_lap.F90
r2082 r2104 13 13 !! 3.0 ! 10-06 (C. Ethe, G. Madec) Merge TRA-TRC 14 14 !!---------------------------------------------------------------------- 15 15 16 !!---------------------------------------------------------------------- 16 17 !! tra_ldf_lap : update the tracer trend with the horizontal diffusion 17 18 !! using a iso-level harmonic (laplacien) operator. 18 19 !!---------------------------------------------------------------------- 19 !! * Modules used20 20 USE oce ! ocean dynamics and active tracers 21 21 USE dom_oce ! ocean space and time domain … … 25 25 USE trc_oce ! share passive tracers/Ocean variables 26 26 27 28 27 IMPLICIT NONE 29 28 PRIVATE 30 29 31 !! * Routine accessibility 32 PUBLIC tra_ldf_lap ! routine called by step.F90 30 PUBLIC tra_ldf_lap ! routine called by step.F90 33 31 34 32 REAL(wp), DIMENSION(jpi,jpj) :: e1ur, e2vr ! scale factor coefficients … … 40 38 !!---------------------------------------------------------------------- 41 39 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 42 !! $Id$ 40 !! $Id$ 43 41 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt 44 42 !!---------------------------------------------------------------------- … … 46 44 CONTAINS 47 45 48 SUBROUTINE tra_ldf_lap( kt, cdtype, pgu, pgv, &46 SUBROUTINE tra_ldf_lap( kt, cdtype, pgu, pgv, & 49 47 & ptb, pta, kjpt ) 50 48 !!---------------------------------------------------------------------- … … 68 66 !! harmonic mixing trend. 69 67 !!---------------------------------------------------------------------- 70 !!71 68 USE oce , ztu => ua ! use ua as workspace 72 69 USE oce , ztv => va ! use va as workspace 73 70 !! 74 INTEGER , INTENT(in ) :: kt! ocean time-step index75 CHARACTER(len=3) , INTENT(in ) :: cdtype! =TRA or TRC (tracer indicator)76 INTEGER , INTENT(in ) :: kjpt! number of tracers77 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,kjpt ) :: pgu, pgv! tracer gradient at pstep levels78 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb! before and now tracer fields79 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta! tracer trend71 INTEGER , INTENT(in ) :: kt ! ocean time-step index 72 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 73 INTEGER , INTENT(in ) :: kjpt ! number of tracers 74 REAL(wp), DIMENSION(jpi,jpj ,kjpt), INTENT(in ) :: pgu, pgv ! tracer gradient at pstep levels 75 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 76 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 80 77 !! 81 INTEGER :: ji, jj, jk, jn ! dummy loop indices 82 INTEGER :: iku, ikv ! temporary integers 83 REAL(wp) :: & 84 zabe1, zabe2, ztra, zbtr ! temporary scalars 78 INTEGER :: ji, jj, jk, jn ! dummy loop indices 79 INTEGER :: iku, ikv ! local integers 80 REAL(wp) :: zabe1, zabe2, zbtr ! local scalars 85 81 !!---------------------------------------------------------------------- 86 82 87 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 )) THEN83 IF( kt == nit000 ) THEN 88 84 IF(lwp) WRITE(numout,*) 89 85 IF(lwp) WRITE(numout,*) 'tra_ldf_lap : iso-level laplacian diffusion on ', cdtype … … 93 89 ENDIF 94 90 95 ! 96 DO jn = 1, kjpt ! tracer loop 97 ! ! =========== 98 ! 99 DO jk = 1, jpkm1 91 ! ! =========== ! 92 DO jn = 1, kjpt ! tracer loop ! 93 ! ! =========== ! 94 DO jk = 1, jpkm1 ! slab loop 100 95 ! 101 96 ! 1. First derivative (gradient) … … 133 128 DO ji = fs_2, fs_jpim1 ! vector opt. 134 129 zbtr = 1.0 / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 135 ! horizontal diffusive trends 136 ztra = zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) & 137 & + ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) 138 ! add it to the general tracer trends 139 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 130 ! horizontal diffusive trends added to the general tracer trends 131 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) & 132 & + ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) 140 133 END DO 141 134 END DO 142 ! ! =============135 ! 143 136 END DO ! End of slab 144 ! ! =============137 ! 145 138 ! "Poleward" diffusive heat or salt transports 146 139 IF( cdtype == 'TRA' .AND. ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN … … 148 141 IF( jn == jp_sal) pst_ldf(:) = ptr_vj( ztv(:,:,:) ) 149 142 ENDIF 150 ! 151 END DO 152 ! 143 ! ! ================== 144 END DO ! end of tracer loop 145 ! ! ================== 153 146 END SUBROUTINE tra_ldf_lap 154 147 -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/tranpc.F90
r2082 r2104 8 8 !! NEMO 1.0 ! 2002-06 (G. Madec) free form F90 9 9 !! 3.0 ! 2008-06 (G. Madec) applied on ta, sa and called before tranxt in step.F90 10 !! 3.3 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA 10 11 !!---------------------------------------------------------------------- 11 12 … … 55 56 !! References : Madec, et al., 1991, JPO, 21, 9, 1349-1371. 56 57 !!---------------------------------------------------------------------- 57 !!58 58 INTEGER, INTENT(in) :: kt ! ocean time-step index 59 59 !! -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/tranxt.F90
r2083 r2104 15 15 !! 3.0 ! 2008-06 (G. Madec) time stepping always done in trazdf 16 16 !! 3.1 ! 2009-02 (G. Madec, R. Benshila) re-introduce the vvl option 17 !! 3.3 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA 17 18 !!---------------------------------------------------------------------- 18 19 … … 87 88 !! 88 89 INTEGER :: jk ! dummy loop indices 89 REAL(wp) :: zfact ! temporaryscalars90 REAL(wp) :: zfact ! local scalars 90 91 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds 91 92 92 !!---------------------------------------------------------------------- 93 93 … … 131 131 132 132 ! Leap-Frog + Asselin filter time stepping 133 IF( lk_vvl ) THEN ; CALL tra_nxt_vvl( kt, nit000,tsb, tsn, tsa, jpts ) ! variable volume level (vvl)134 ELSE ; CALL tra_nxt_fix( kt, nit000,tsb, tsn, tsa, jpts ) ! fixed volume level133 IF( lk_vvl ) THEN ; CALL tra_nxt_vvl( kt, tsb, tsn, tsa, jpts ) ! variable volume level (vvl) 134 ELSE ; CALL tra_nxt_fix( kt, tsb, tsn, tsa, jpts ) ! fixed volume level 135 135 ENDIF 136 136 … … 160 160 END SUBROUTINE tra_nxt 161 161 162 SUBROUTINE tra_nxt_fix( kt, kit000, & 163 & ptb, ptn, pta, kjpt)162 163 SUBROUTINE tra_nxt_fix( kt, ptb, ptn, pta, kjpt ) 164 164 !!---------------------------------------------------------------------- 165 165 !! *** ROUTINE tra_nxt_fix *** … … 184 184 !!---------------------------------------------------------------------- 185 185 INTEGER , INTENT(in ) :: kt ! ocean time-step index 186 INTEGER , INTENT(in ) :: kit000 ! first time-step index187 186 INTEGER , INTENT(in ) :: kjpt ! number of tracers 188 187 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb ! before tracer fields … … 194 193 !!---------------------------------------------------------------------- 195 194 196 IF( kt == kit000 ) THEN195 IF( kt == nit000 ) THEN 197 196 IF(lwp) WRITE(numout,*) 198 197 IF(lwp) WRITE(numout,*) 'tra_nxt_fix : time stepping' … … 204 203 ! ! ----------------------- ! 205 204 ! 206 IF( neuler == 0 .AND. kt == kit000 ) THEN ! Euler time-stepping at first time-step205 IF( neuler == 0 .AND. kt == nit000 ) THEN ! Euler time-stepping at first time-step 207 206 ! ! (only swap) 208 207 DO jn = 1, kjpt … … 234 233 ! ! ----------------------- ! 235 234 ! 236 IF( neuler == 0 .AND. kt == kit000 ) THEN ! Euler time-stepping at first time-step235 IF( neuler == 0 .AND. kt == nit000 ) THEN ! Euler time-stepping at first time-step 237 236 DO jn = 1, kjpt 238 237 DO jk = 1, jpkm1 … … 262 261 END SUBROUTINE tra_nxt_fix 263 262 264 SUBROUTINE tra_nxt_vvl( kt, kit000, & 265 & ptb, ptn, pta, kjpt)263 264 SUBROUTINE tra_nxt_vvl( kt, ptb, ptn, pta, kjpt ) 266 265 !!---------------------------------------------------------------------- 267 266 !! *** ROUTINE tra_nxt_vvl *** … … 288 287 !!---------------------------------------------------------------------- 289 288 INTEGER , INTENT(in ) :: kt ! ocean time-step index 290 INTEGER , INTENT(in ) :: kit000 ! first time-step index291 289 INTEGER , INTENT(in ) :: kjpt ! number of tracers 292 290 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb ! before tracer fields … … 300 298 !!---------------------------------------------------------------------- 301 299 302 IF( kt == kit000 ) THEN300 IF( kt == nit000 ) THEN 303 301 IF(lwp) WRITE(numout,*) 304 302 IF(lwp) WRITE(numout,*) 'tra_nxt_vvl : time stepping' … … 310 308 ! ! ----------------------- ! 311 309 ! 312 IF( neuler == 0 .AND. kt == kit000 ) THEN ! Euler time-stepping at first time-step310 IF( neuler == 0 .AND. kt == nit000 ) THEN ! Euler time-stepping at first time-step 313 311 DO jn = 1, kjpt ! (only swap) 314 312 DO jk = 1, jpkm1 … … 358 356 ! ! ----------------------- ! 359 357 ! 360 IF( neuler == 0 .AND. kt == kit000 ) THEN ! case of Euler time-stepping at first time-step358 IF( neuler == 0 .AND. kt == nit000 ) THEN ! case of Euler time-stepping at first time-step 361 359 DO jn = 1, kjpt ! No filter nor thickness weighting computation required 362 360 DO jk = 1, jpkm1 ! ONLY swap -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/trasbc.F90
r2052 r2104 4 4 !! Ocean active tracers: surface boundary condition 5 5 !!============================================================================== 6 !! History : 8.2 ! 98-10 (G. Madec, G. Roullet, M. Imbard) Original code 7 !! 8.2 ! 01-02 (D. Ludicone) sea ice and free surface 8 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 6 !! History : OPA ! 1998-10 (G. Madec, G. Roullet, M. Imbard) Original code 7 !! 8.2 ! 2001-02 (D. Ludicone) sea ice and free surface 8 !! NEMO 1.0 ! 2002-06 (G. Madec) F90: Free form and module 9 !! 3.3 ! 2010-09 (C. Ethe, G. Madec) Merge TRA-TRC 9 10 !!---------------------------------------------------------------------- 10 11 … … 33 34 # include "vectopt_loop_substitute.h90" 34 35 !!---------------------------------------------------------------------- 35 !! OPA 9.0 , LOCEAN-IPSL (2005)36 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 36 37 !! $Id$ 37 38 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) … … 100 101 !! - save the trend it in ttrd ('key_trdtra') 101 102 !!---------------------------------------------------------------------- 102 !! 103 INTEGER, INTENT(in) :: kt ! ocean time-step index 104 !! 105 INTEGER :: ji, jj, jk ! dummy loop indices 106 REAL(wp) :: zta, zsa ! temporary scalars, adjustment to temperature and salinity 107 REAL(wp) :: zata, zasa ! temporary scalars, calculations of automatic change to temp & sal due to vvl (done elsewhere) 108 REAL(wp) :: zsrau, zse3t, zdep ! temporary scalars, 1/density, 1/height of box, 1/height of effected water column 103 INTEGER, INTENT(in) :: kt ! ocean time-step index 104 !! 105 INTEGER :: ji, jj, jk ! dummy loop indices 106 REAL(wp) :: zta, zsa ! local scalars, adjustment to temperature and salinity 107 REAL(wp) :: zata, zasa ! local scalars, calculations of automatic change to temp & sal due to vvl (done elsewhere) 108 REAL(wp) :: zsrau, zse3t, zdep ! local scalars, 1/density, 1/height of box, 1/height of effected water column 109 109 REAL(wp) :: zdheat, zdsalt ! total change of temperature and salinity 110 110 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds … … 136 136 #endif 137 137 IF( lk_vvl) THEN 138 zta = ro0cpr * qns(ji,jj) * zse3t & ! temperature : heat flux 139 & - emp(ji,jj) * zsrau * tsn(ji,jj,1,jp_tem) * zse3t ! & cooling/heating effet of EMP flux 140 zsa = ( emps(ji,jj) - emp(ji,jj) ) & 141 & * zsrau * tsn(ji,jj,1,jp_sal) * zse3t ! concent./dilut. effect due to sea-ice 142 ! melt/formation and (possibly) SSS restoration 138 ! temperature : heat flux and heat content of EMP flux 139 zta = ( ro0cpr * qns(ji,jj) - emp(ji,jj) * zsrau * tsn(ji,jj,1,jp_tem) ) * zse3t 140 ! Salinity : concent./dilut. effect due to sea-ice melt/formation and (possibly) SSS restoration 141 zsa = ( emps(ji,jj) - emp(ji,jj) ) * zsrau * tsn(ji,jj,1,jp_sal) * zse3t 143 142 ELSE 144 zta = ro0cpr * qns(ji,jj) * zse3t ! temperature : heat flux145 zsa = emps(ji,jj) * zsrau * tsn(ji,jj,1,jp_sal) * zse3t 143 zta = ro0cpr * qns(ji,jj) * zse3t ! temperature : heat flux 144 zsa = emps(ji,jj) * zsrau * tsn(ji,jj,1,jp_sal) * zse3t ! salinity : concent./dilut. effect 146 145 ENDIF 147 146 tsa(ji,jj,1,jp_tem) = tsa(ji,jj,1,jp_tem) + zta ! add the trend to the general tracer trend … … 150 149 END DO 151 150 152 IF ( ln_rnf .AND. ln_rnf_att ) THEN 153 ! Concentration / dilution effect on (t,s) due to river runoff 151 IF( ln_rnf .AND. ln_rnf_att ) THEN ! Concentration / dilution effect on (t,s) due to river runoff 154 152 DO jj = 1, jpj 155 153 DO ji = 1, jpi 156 rnf_dep(ji,jj) = 0. 154 rnf_dep(ji,jj) = 0.e0 157 155 DO jk = 1, rnf_mod_dep(ji,jj) ! recalculates rnf_dep to be the depth 158 156 rnf_dep(ji,jj) = rnf_dep(ji,jj) + fse3t(ji,jj,jk) ! in metres to the bottom of the relevant grid box 159 END DO157 END DO 160 158 zdep = 1. / rnf_dep(ji,jj) 161 159 zse3t= 1. / fse3t(ji,jj,1) 162 IF ( rnf_tmp(ji,jj) == -999 ) rnf_tmp(ji,jj) = tsn(ji,jj,1,jp_tem)! if not specified set runoff temp to be sst163 164 IF ( rnf(ji,jj) > 0.0 ) THEN160 IF( rnf_tmp(ji,jj) == -999 ) rnf_tmp(ji,jj) = tsn(ji,jj,1,jp_tem) ! if not specified set runoff temp to be sst 161 162 IF( rnf(ji,jj) > 0.e0 ) THEN 165 163 166 164 IF( lk_vvl ) THEN 167 165 ! indirect flux, concentration or dilution effect : force a dilution effect in all levels 168 zdheat = 0. 0169 zdsalt = 0. 0166 zdheat = 0.e0 167 zdsalt = 0.e0 170 168 DO jk = 1, rnf_mod_dep(ji,jj) 171 169 zta = -tsn(ji,jj,jk,jp_tem) * rnf(ji,jj) * zsrau * zdep 172 170 zsa = -tsn(ji,jj,jk,jp_sal) * rnf(ji,jj) * zsrau * zdep 173 tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + zta 171 tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + zta ! add the trend to the general tracer trend 174 172 tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) + zsa 175 173 zdheat = zdheat + zta * fse3t(ji,jj,jk) 176 174 zdsalt = zdsalt + zsa * fse3t(ji,jj,jk) 177 END DO178 ! negate this total change in heat and salt content from top level 175 END DO 176 ! negate this total change in heat and salt content from top level !!gm I don't understand this 179 177 zta = -zdheat * zse3t 180 178 zsa = -zdsalt * zse3t 181 tsa(ji,jj,1,jp_tem) = tsa(ji,jj,1,jp_tem) + zta 179 tsa(ji,jj,1,jp_tem) = tsa(ji,jj,1,jp_tem) + zta ! add the trend to the general tracer trend 182 180 tsa(ji,jj,1,jp_sal) = tsa(ji,jj,1,jp_sal) + zsa 183 181 … … 187 185 188 186 DO jk = 1, rnf_mod_dep(ji,jj) 189 tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + zta 187 tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + zta ! add the trend to the general tracer trend 190 188 tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) + zsa 191 ENDDO 192 189 END DO 193 190 ELSE 194 191 DO jk = 1, rnf_mod_dep(ji,jj) 195 192 zta = ( rnf_tmp(ji,jj) - tsn(ji,jj,jk,jp_tem) ) * rnf(ji,jj) * zsrau * zdep 196 193 zsa = ( rnf_sal(ji,jj) - tsn(ji,jj,jk,jp_sal) ) * rnf(ji,jj) * zsrau * zdep 197 tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + zta 194 tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + zta ! add the trend to the general tracer trend 198 195 tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) + zsa 199 END DO196 END DO 200 197 ENDIF 201 198 202 ELSE IF( rnf(ji,jj) < 0.) THEN ! for use in baltic when flow is out of domain, want no change in temp and sal199 ELSEIF( rnf(ji,jj) < 0.e0) THEN ! for use in baltic when flow is out of domain, want no change in temp and sal 203 200 204 201 IF( lk_vvl ) THEN … … 212 209 ENDIF 213 210 214 END DO215 END DO216 217 ELSE IF( ln_rnf ) THEN 218 219 ! Concentration dilution effect on (t,s) due to runoff without temperatue, salinity and depth attributes 211 END DO 212 END DO 213 214 ELSE IF( ln_rnf ) THEN ! Concentration dilution effect on (t,s) due to runoff without T, S and depth attributes 215 216 220 217 DO jj = 2, jpj 221 218 DO ji = fs_2, fs_jpim1 ! vector opt. … … 225 222 IF( lk_vvl) THEN 226 223 zta = rnf(ji,jj) * zsrau * tsn(ji,jj,1,jp_tem) * zse3t ! & cooling/heating effect of runoff 227 zsa = 0.e0 ! No salinity concent./dilut. effect224 zsa = 0.e0 ! No salinity concent./dilut. effect 228 225 ELSE 229 226 zta = 0.0 ! temperature : heat flux -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/traswp.F90
r2034 r2104 4 4 !! Ocean active tracers: swapping array 5 5 !!============================================================================== 6 USE par_oce 6 USE par_oce ! ocean parameters 7 7 USE oce ! ocean dynamics and active tracers 8 8 … … 15 15 !!---------------------------------------------------------------------- 16 16 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 17 !! $Id: traswap.F90 2024 2010-07-29 10:57:35Z cetlod$17 !! $Id: $ 18 18 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 19 19 !!---------------------------------------------------------------------- … … 28 28 !! 29 29 !!---------------------------------------------------------------------- 30 30 ! 31 31 tsn(:,:,:,jp_tem) = tn(:,:,:) ; tsn(:,:,:,jp_sal) = sn(:,:,:) 32 32 tsb(:,:,:,jp_tem) = tb(:,:,:) ; tsb(:,:,:,jp_sal) = sb(:,:,:) 33 33 tsa(:,:,:,jp_tem) = ta(:,:,:) ; tsa(:,:,:,jp_sal) = sa(:,:,:) 34 34 ! 35 35 END SUBROUTINE tra_swap 36 36 … … 42 42 !! 43 43 !!---------------------------------------------------------------------- 44 44 ! 45 45 tn(:,:,:) = tsn(:,:,:,jp_tem) ; sn(:,:,:) = tsn(:,:,:,jp_sal) 46 46 tb(:,:,:) = tsb(:,:,:,jp_tem) ; sb(:,:,:) = tsb(:,:,:,jp_sal) 47 47 ta(:,:,:) = tsa(:,:,:,jp_tem) ; sa(:,:,:) = tsa(:,:,:,jp_sal) 48 48 ! 49 49 END SUBROUTINE tra_unswap 50 50 -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/trazdf.F90
r2082 r2104 4 4 !! Ocean active tracers: vertical component of the tracer mixing trend 5 5 !!============================================================================== 6 !! History : 9.0 ! 2005-11 (G. Madec) Original code7 !! NEMO3.0 ! 2008-01 (C. Ethe, G. Madec) merge TRC-TRA6 !! History : 1.0 ! 2005-11 (G. Madec) Original code 7 !! 3.0 ! 2008-01 (C. Ethe, G. Madec) merge TRC-TRA 8 8 !!---------------------------------------------------------------------- 9 9 10 10 !!---------------------------------------------------------------------- 11 11 !! tra_zdf : Update the tracer trend with the vertical diffusion 12 !! zdf_ctl : ???12 !! tra_zdf_init : initialisation of the computation 13 13 !!---------------------------------------------------------------------- 14 14 USE oce ! ocean dynamics and tracers variables … … 47 47 # include "vectopt_loop_substitute.h90" 48 48 !!---------------------------------------------------------------------- 49 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 49 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 50 50 !! $Id$ 51 51 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) … … 61 61 !!--------------------------------------------------------------------- 62 62 INTEGER, INTENT( in ) :: kt ! ocean time-step index 63 63 !! 64 64 INTEGER :: jk ! Dummy loop indices 65 65 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds ! 3D workspace … … 124 124 !!---------------------------------------------------------------------- 125 125 126 ! Define the vertical tracer physics scheme127 ! ==========================================128 129 126 ! Choice from ln_zdfexp already read in namelist in zdfini module 130 IF( ln_zdfexp ) THEN ! use explicit scheme 131 nzdf = 0 132 ELSE ! use implicit scheme 133 nzdf = 1 127 IF( ln_zdfexp ) THEN ; nzdf = 0 ! use explicit scheme 128 ELSE ; nzdf = 1 ! use implicit scheme 134 129 ENDIF 135 130 … … 138 133 IF( ln_traldf_iso ) nzdf = 1 ! iso-neutral lateral physics 139 134 IF( ln_traldf_hor .AND. ln_sco ) nzdf = 1 ! horizontal lateral physics in s-coordinate 140 141 IF( ln_zdfexp .AND. nzdf == 1 ) THEN 142 CALL ctl_stop( 'tra_zdf : If using the rotation of lateral mixing operator or TKE ', & 143 & ' or KPP scheme, the implicit scheme is required, set ln_zdfexp = .false.' ) 144 ENDIF 135 IF( ln_zdfexp .AND. nzdf == 1 ) CALL ctl_stop( 'tra_zdf : If using the rotation of lateral mixing operator', & 136 & ' TKE or KPP scheme, the implicit scheme is required, set ln_zdfexp = .false.' ) 145 137 146 138 ! Test: esopa … … 155 147 IF( nzdf == 1 ) WRITE(numout,*) ' Implicit (euler backward) scheme' 156 148 ENDIF 157 149 ! 158 150 END SUBROUTINE tra_zdf_init 159 151 -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/trazdf_exp.F90
r2082 r2104 41 41 # include "vectopt_loop_substitute.h90" 42 42 !!---------------------------------------------------------------------- 43 !! NEMO/OPA 44 !! $Id$ 43 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 44 !! $Id$ 45 45 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 46 46 !!---------------------------------------------------------------------- … … 48 48 CONTAINS 49 49 50 SUBROUTINE tra_zdf_exp( kt, cdtype, p2dt, kn_zdfexp, &50 SUBROUTINE tra_zdf_exp( kt, cdtype, p2dt, kn_zdfexp, & 51 51 & ptb , pta , kjpt ) 52 52 !!---------------------------------------------------------------------- … … 73 73 !! ** Action : - after tracer fields pta 74 74 !!--------------------------------------------------------------------- 75 !! 76 INTEGER , INTENT(in ) :: kt ! ocean time-step index 77 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 78 INTEGER , INTENT(in ) :: kjpt ! number of tracers 79 INTEGER , INTENT(in ) :: kn_zdfexp ! number of sub-time step 80 REAL(wp) , INTENT(in ), DIMENSION(jpk) :: p2dt ! vertical profile of tracer time-step 81 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb ! before and now tracer fields 82 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta ! tracer trend 75 INTEGER , INTENT(in ) :: kt ! ocean time-step index 76 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 77 INTEGER , INTENT(in ) :: kjpt ! number of tracers 78 INTEGER , INTENT(in ) :: kn_zdfexp ! number of sub-time step 79 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 80 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 81 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 83 82 !! 84 83 INTEGER :: ji, jj, jk, jn, jl ! dummy loop indices 85 REAL(wp) :: zlavmr, zave3r, ze3tr ! temporaryscalars86 REAL(wp) :: ztra, ze3tb ! temporary scalars84 REAL(wp) :: zlavmr, zave3r, ze3tr ! local scalars 85 REAL(wp) :: ztra, ze3tb ! - - 87 86 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwx, zwy ! 3D workspace 88 87 !!--------------------------------------------------------------------- 89 88 90 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 )) THEN89 IF( kt == nit000 ) THEN 91 90 IF(lwp) WRITE(numout,*) 92 91 IF(lwp) WRITE(numout,*) 'tra_zdf_exp : explicit vertical mixing on ', cdtype … … 96 95 ! Initializations 97 96 ! --------------- 98 zlavmr = 1. / float( kn_zdfexp ) 97 zlavmr = 1. / float( kn_zdfexp ) ! Local constant 99 98 ! 100 99 ! 101 DO jn = 1, kjpt 100 DO jn = 1, kjpt ! loop over tracers 102 101 ! 103 102 zwy(:,:, 1 ) = 0.e0 ! surface boundary conditions: no flux -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/trazdf_imp.F90
r2082 r2104 89 89 !! 90 90 !!--------------------------------------------------------------------- 91 !!92 91 USE oce , ONLY : zwd => ua ! ua used as workspace 93 92 USE oce , ONLY : zws => va ! va - - 94 93 !! 95 INTEGER , INTENT(in ) :: kt! ocean time-step index96 CHARACTER(len=3) , INTENT(in ) :: cdtype! =TRA or TRC (tracer indicator)97 INTEGER , INTENT(in ) :: kjpt! number of tracers98 REAL(wp) , INTENT(in ), DIMENSION(jpk) :: p2dt! vertical profile of tracer time-step99 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb! before and now tracer fields100 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta! tracer trend94 INTEGER , INTENT(in ) :: kt ! ocean time-step index 95 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 96 INTEGER , INTENT(in ) :: kjpt ! number of tracers 97 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 98 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 99 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 101 100 !! 102 101 INTEGER :: ji, jj, jk, jn ! dummy loop indices 103 REAL(wp) :: zavi, zrhs, znvvl ! temporaryscalars102 REAL(wp) :: zavi, zrhs, znvvl ! local scalars 104 103 REAL(wp) :: ze3tb, ze3tn, ze3ta ! variable vertical scale factors 105 104 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwi, zwt ! workspace arrays 106 105 !!--------------------------------------------------------------------- 107 106 108 IF( ( cdtype == 'TRA' .AND. kt == nit000 ) .OR. ( cdtype == 'TRC' .AND. kt == nittrc000 )) THEN107 IF( kt == nit000 ) THEN 109 108 IF(lwp)WRITE(numout,*) 110 109 IF(lwp)WRITE(numout,*) 'tra_zdf_imp : implicit vertical mixing on ', cdtype … … 287 286 DO ji = fs_2, fs_jpim1 288 287 pta(ji,jj,jk,jn) = ( pta(ji,jj,jk,jn) - zws(ji,jj,jk) * pta(ji,jj,jk+1,jn) ) & 289 &/ zwt(ji,jj,jk) * tmask(ji,jj,jk)288 & / zwt(ji,jj,jk) * tmask(ji,jj,jk) 290 289 END DO 291 290 END DO -
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/zpshde.F90
r2082 r2104 4 4 !! z-coordinate - partial step : Horizontal Derivative 5 5 !!============================================================================== 6 !! History : 7 !! OPA 8.5 ! 2002-04 (A. Bozec) Original code 8 !! 8.5 ! 2002-08 (G. Madec E. Durand) Optimization and Free form 9 !! 9.0 ! 2004-03 (C. Ethe) adapted for passive tracers 10 !! NEMO 3.3 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA 6 !! History : OPA ! 2002-04 (A. Bozec) Original code 7 !! 8.5 ! 2002-08 (G. Madec E. Durand) Optimization and Free form 8 !! NEMO 1.0 ! 2004-03 (C. Ethe) adapted for passive tracers 9 !! 3.3 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA 11 10 !!============================================================================== 12 11 … … 15 14 !! ocean level (Z-coord. with Partial Steps) 16 15 !!---------------------------------------------------------------------- 17 !! * Modules used18 16 USE dom_oce ! ocean space domain variables 19 17 USE oce ! ocean dynamics and tracers variables … … 26 24 PRIVATE 27 25 28 !! * Routine accessibility 29 PUBLIC zps_hde ! routine called by step.F90 30 PUBLIC zps_hde_init ! routine called by opa.F90 31 32 !! * module variables 33 INTEGER, DIMENSION(jpi,jpj) :: & 34 mbatu, mbatv ! bottom ocean level index at U- and V-points 26 PUBLIC zps_hde ! routine called by step.F90 27 PUBLIC zps_hde_init ! routine called by opa.F90 28 29 INTEGER, DIMENSION(jpi,jpj) :: mbatu, mbatv ! bottom ocean level index at U- and V-points 35 30 36 31 !! * Substitutions … … 38 33 # include "vectopt_loop_substitute.h90" 39 34 !!---------------------------------------------------------------------- 40 !!---------------------------------------------------------------------- 41 !! OPA 9.0 , LOCEAN-IPSL (2005) 42 !! $Id$ 43 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt 35 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 36 !! $Id$ 37 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 44 38 !!---------------------------------------------------------------------- 45 39 CONTAINS … … 90 84 !! and rd at V-points 91 85 !!---------------------------------------------------------------------- 92 !! * Arguments 93 INTEGER , INTENT( in ) :: kt ! ocean time-step index 94 INTEGER , INTENT( in ) :: kjpt ! number of tracers 95 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT( in ) :: pta ! 4D active or passive tracers fields 96 REAL(wp), DIMENSION(jpi,jpj, kjpt), INTENT( out) :: pgtu, pgtv ! horizontal grad. of ptra u- and v-points 97 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT( in ), OPTIONAL :: prd ! 3D rd fields 98 REAL(wp), DIMENSION(jpi,jpj ), INTENT( out), OPTIONAL :: pgru, pgrv ! horizontal grad. of prd u- and v-points 99 !! * Local declarations 86 INTEGER , INTENT(in ) :: kt ! ocean time-step index 87 INTEGER , INTENT(in ) :: kjpt ! number of tracers 88 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pta ! 4D tracers fields 89 REAL(wp), DIMENSION(jpi,jpj, kjpt), INTENT( out) :: pgtu, pgtv ! hor. grad. of ptra at u- & v-pts 90 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ), OPTIONAL :: prd ! 3D density anomaly fields 91 REAL(wp), DIMENSION(jpi,jpj ), INTENT( out), OPTIONAL :: pgru, pgrv ! hor. grad. of prd at u- & v-pts 92 !! 100 93 INTEGER :: ji, jj, jn ! Dummy loop indices 101 94 INTEGER :: iku, ikv ! partial step level at u- and v-points … … 109 102 ! Interpolation of tracers at the last ocean level 110 103 DO jn = 1, kjpt 104 ! 111 105 # if defined key_vectopt_loop 112 106 jj = 1 … … 155 149 # endif 156 150 END DO 157 158 ! Lateral boundary conditions on each gradient 159 CALL lbc_lnk( pgtu(:,:,jn) , 'U', -1. ) 160 CALL lbc_lnk( pgtv(:,:,jn) , 'V', -1. ) 161 151 CALL lbc_lnk( pgtu(:,:,jn), 'U', -1. ) ; CALL lbc_lnk( pgtv(:,:,jn), 'V', -1. ) ! Lateral boundary cond. 152 ! 162 153 END DO 163 154 164 ! horizontal derivative of rd 165 IF( PRESENT( prd ) ) THEN 166 ! depth of the partial step level 155 ! horizontal derivative of density anomalies (rd) 156 IF( PRESENT( prd ) ) THEN ! depth of the partial step level 167 157 # if defined key_vectopt_loop 168 158 jj = 1 … … 193 183 ! Compute interpolated rd from zti, ztj for the 2 cases at the depth of the partial 194 184 ! step and store it in zri, zrj for each case 195 CALL eos( zti, zhi, zri ) 196 CALL eos( ztj, zhj, zrj ) 185 CALL eos( zti, zhi, zri ) ; CALL eos( ztj, zhj, zrj ) 197 186 198 187 ! Gradient of density at the last level … … 222 211 # endif 223 212 END DO 224 225 ! Lateral boundary conditions on each gradient 226 CALL lbc_lnk( pgru , 'U', -1. ) ; CALL lbc_lnk( pgrv , 'V', -1. ) 213 CALL lbc_lnk( pgru , 'U', -1. ) ; CALL lbc_lnk( pgrv , 'V', -1. ) ! Lateral boundary conditions 227 214 ! 228 215 END IF … … 230 217 END SUBROUTINE zps_hde 231 218 219 232 220 SUBROUTINE zps_hde_init 233 221 !!---------------------------------------------------------------------- … … 237 225 !! 238 226 !!---------------------------------------------------------------------- 239 !! * Local declarations 240 INTEGER :: ji, jj ! Dummy loop indices 241 REAL(wp), DIMENSION(jpi,jpj) :: zti, ztj ! temporary arrays 242 !!---------------------------------------------------------------------- 243 227 INTEGER :: ji, jj ! Dummy loop indices 228 REAL(wp), DIMENSION(jpi,jpj) :: zti, ztj ! 2D workspace 229 !!---------------------------------------------------------------------- 230 ! 244 231 mbatu(:,:) = 0 245 232 mbatv(:,:) = 0 … … 253 240 ztj(:,:) = FLOAT( mbatv(:,:) ) 254 241 ! lateral boundary conditions: T-point, sign unchanged 255 CALL lbc_lnk( zti , 'U', 1. ) 256 CALL lbc_lnk( ztj , 'V', 1. ) 242 CALL lbc_lnk( zti , 'U', 1. ) ; CALL lbc_lnk( ztj , 'V', 1. ) 257 243 mbatu(:,:) = MAX( INT( zti(:,:) ), 2 ) 258 244 mbatv(:,:) = MAX( INT( ztj(:,:) ), 2 ) 259 245 ! 260 246 END SUBROUTINE zps_hde_init 261 247 !!======================================================================
Note: See TracChangeset
for help on using the changeset viewer.