- Timestamp:
- 2010-07-29T12:57:35+02:00 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DEV_r2006_merge_TRA_TRC/NEMO/OPA_SRC/TRA/trazdf_exp.F90
r1537 r2024 2 2 !!============================================================================== 3 3 !! *** MODULE trazdf_exp *** 4 !! Ocean activetracers: vertical component of the tracer mixing trend using5 !! 4 !! Ocean tracers: vertical component of the tracer mixing trend using 5 !! a split-explicit time-stepping 6 6 !!============================================================================== 7 7 !! History : OPA ! 1990-10 (B. Blanke) Original code … … 16 16 !! - ! 2005-11 (G. Madec) New organisation 17 17 !! 3.0 ! 2008-04 (G. Madec) leap-frog time stepping done in trazdf 18 !! 3.3 ! 2010-06 (C. Ethe, G. Madec) Merge TRA-TRC 18 19 !!---------------------------------------------------------------------- 19 20 … … 24 25 USE oce ! ocean dynamics and active tracers 25 26 USE dom_oce ! ocean space and time domain 26 USE domvvl ! variablevolume levels 27 USE trdmod ! ocean active tracers trends 28 USE trdmod_oce ! ocean variables trends 27 USE domvvl ! variable volume levels 29 28 USE zdf_oce ! ocean vertical physics 30 29 USE zdfddm ! ocean vertical physics: double diffusion 31 30 USE in_out_manager ! I/O manager 32 USE prtctl ! Print control33 31 34 32 IMPLICIT NONE … … 49 47 CONTAINS 50 48 51 SUBROUTINE tra_zdf_exp( kt, p2dt ) 49 SUBROUTINE tra_zdf_exp( kt , cdtype, p2dt, kn_zdfexp, & 50 & ptrab , ptraa , kjpt ) 52 51 !!---------------------------------------------------------------------- 53 52 !! *** ROUTINE tra_zdf_exp *** … … 58 57 !! ** Method : - The after tracer fields due to the vertical diffusion 59 58 !! of tracers alone is given by: 60 !! zwx = tb + p2dt difft61 !! where difft = dz( avt dz( tb) ) = 1/e3t dk+1( avt/e3w dk(tb) )62 !! (if lk_zdfddm=T use avs on salinity instead of avt)59 !! zwx = ptrab + p2dt difft 60 !! where difft = dz( avt dz(ptrab) ) = 1/e3t dk+1( avt/e3w dk(ptrab) ) 61 !! (if lk_zdfddm=T use avs on salinity and passive tracers instead of avt) 63 62 !! difft is evaluated with an Euler split-explit scheme using a 64 63 !! no flux boundary condition at both surface and bottomi boundaries. … … 66 65 !! - the after tracer fields due to the whole trend is 67 66 !! obtained in leap-frog environment by : 68 !! ta = zwx + p2dt ta67 !! ptraa = zwx + p2dt ptraa 69 68 !! - in case of variable level thickness (lk_vvl=T) the 70 69 !! the leap-frog is applied on thickness weighted tracer. That is: 71 !! ta = [ tb*e3tb + e3tn*( zwx - tb + p2dt ta ) ] / e3tn70 !! ptraa = [ ptrab*e3tb + e3tn*( zwx - ptrab + p2dt ptraa ) ] / e3tn 72 71 !! 73 !! ** Action : - after tracer fields (ta,sa)72 !! ** Action : - after tracer fields pta 74 73 !!--------------------------------------------------------------------- 75 INTEGER , INTENT(in) :: kt ! ocean time-step index 76 REAL(wp), INTENT(in), DIMENSION(jpk) :: p2dt ! vertical profile of tracer time-step 77 !! 78 INTEGER :: ji, jj, jk, jl ! dummy loop indices 79 REAL(wp) :: zlavmr, zave3r, ze3tr ! temporary scalars 80 REAL(wp) :: zta, zsa, ze3tb ! temporary scalars 81 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwx, zwy, zwz, zww ! 3D workspace 74 !! * Arguments 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) , INTENT(in ), DIMENSION(jpk) :: p2dt ! vertical profile of tracer time-step 80 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: ptrab ! before and now tracer fields 81 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptraa ! tracer trend 82 !! * Local declarations 83 INTEGER :: ji, jj, jk, jn, jl ! dummy loop indices 84 REAL(wp) :: zlavmr, zave3r, ze3tr ! temporary scalars 85 REAL(wp) :: ztra, ze3tb ! temporary scalars 86 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwx, zwy ! 3D workspace 82 87 !!--------------------------------------------------------------------- 83 88 … … 90 95 ! Initializations 91 96 ! --------------- 92 zlavmr = 1. / float( nn_zdfexp ) ! Local constant97 zlavmr = 1. / float( kn_zdfexp ) ! Local constant 93 98 ! 94 zwy(:,:, 1 ) = 0.e0 ; zww(:,:, 1 ) = 0.e0 ! surface boundary conditions: no flux95 zwy(:,:,jpk) = 0.e0 ; zww(:,:,jpk) = 0.e0 ! bottom boundary conditions: no flux96 99 ! 97 zwx(:,:,:) = tb(:,:,:) ; zwz(:,:,:) = sb(:,:,:) ! zwx and zwz arrays set to before tracer values 100 DO jn = 1, kjpt 101 ! 102 zwy(:,:, 1 ) = 0.e0 ! surface boundary conditions: no flux 103 zwy(:,:,jpk) = 0.e0 ! bottom boundary conditions: no flux 104 ! 105 zwx(:,:,:) = ptrab(:,:,:,jn) ! zwx array set to before tracer values 98 106 99 ! Split-explicit loop (after tracer due to the vertical diffusion alone) 100 ! ------------------- 101 ! 102 DO jl = 1, nn_zdfexp 103 ! ! first vertical derivative 104 DO jk = 2, jpk 105 DO jj = 2, jpjm1 106 DO ji = fs_2, fs_jpim1 ! vector opt. 107 zave3r = 1.e0 / fse3w_n(ji,jj,jk) 108 zwy(ji,jj,jk) = avt(ji,jj,jk) * ( zwx(ji,jj,jk-1) - zwx(ji,jj,jk) ) * zave3r 109 zww(ji,jj,jk) = fsavs(ji,jj,jk) * ( zwz(ji,jj,jk-1) - zwz(ji,jj,jk) ) * zave3r 107 ! Split-explicit loop (after tracer due to the vertical diffusion alone) 108 ! ------------------- 109 ! 110 DO jl = 1, kn_zdfexp 111 ! ! first vertical derivative 112 DO jk = 2, jpk 113 DO jj = 2, jpjm1 114 DO ji = fs_2, fs_jpim1 ! vector opt. 115 zave3r = 1.e0 / fse3w_n(ji,jj,jk) 116 IF( cdtype == 'TRA' .AND. jn == jp_tem ) THEN ! temperature : use of avt 117 zwy(ji,jj,jk) = avt(ji,jj,jk) * ( zwx(ji,jj,jk-1) - zwx(ji,jj,jk) ) * zave3r 118 ELSE ! salinity or pass. tracer : use of avs 119 zwy(ji,jj,jk) = fsavs(ji,jj,jk) * ( zwx(ji,jj,jk-1) - zwx(ji,jj,jk) ) * zave3r 120 END IF 121 END DO 110 122 END DO 111 123 END DO 112 END DO 113 ! 114 DO jk = 1, jpkm1 ! second vertical derivative ==> tracer at kt+l*2*rdt/nn_zdfexp 115 DO jj = 2, jpjm1 116 DO ji = fs_2, fs_jpim1 ! vector opt. 117 ze3tr = zlavmr / fse3t_n(ji,jj,jk) 118 zwx(ji,jj,jk) = zwx(ji,jj,jk) + p2dt(jk) * ( zwy(ji,jj,jk) - zwy(ji,jj,jk+1) ) * ze3tr 119 zwz(ji,jj,jk) = zwz(ji,jj,jk) + p2dt(jk) * ( zww(ji,jj,jk) - zww(ji,jj,jk+1) ) * ze3tr 124 ! 125 DO jk = 1, jpkm1 ! second vertical derivative ==> tracer at kt+l*2*rdt/nn_zdfexp 126 DO jj = 2, jpjm1 127 DO ji = fs_2, fs_jpim1 ! vector opt. 128 ze3tr = zlavmr / fse3t_n(ji,jj,jk) 129 zwx(ji,jj,jk) = zwx(ji,jj,jk) + p2dt(jk) * ( zwy(ji,jj,jk) - zwy(ji,jj,jk+1) ) * ze3tr 130 END DO 120 131 END DO 121 132 END DO 133 ! 122 134 END DO 135 136 ! After tracer due to all trends 137 ! ------------------------------ 138 IF( lk_vvl ) THEN ! variable level thickness : leap-frog on tracer*e3t 139 DO jk = 1, jpkm1 140 DO jj = 2, jpjm1 141 DO ji = fs_2, fs_jpim1 ! vector opt. 142 ze3tb = fse3t_b(ji,jj,jk) / fse3t(ji,jj,jk) ! before e3t 143 ztra = zwx(ji,jj,jk) - ptrab(ji,jj,jk,jn) + p2dt(jk) * ptraa(ji,jj,jk,jn) ! total trends * 2*rdt 144 ptraa(ji,jj,jk,jn) = ( ze3tb * ptrab(ji,jj,jk,jn) + ztra ) * tmask(ji,jj,jk) 145 END DO 146 END DO 147 END DO 148 ELSE ! fixed level thickness : leap-frog on tracers 149 DO jk = 1, jpkm1 150 DO jj = 2, jpjm1 151 DO ji = fs_2, fs_jpim1 ! vector opt. 152 ptraa(ji,jj,jk,jn) = ( zwx(ji,jj,jk) + p2dt(jk) * ptraa(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 153 END DO 154 END DO 155 END DO 156 ENDIF 123 157 ! 124 158 END DO 125 126 ! After tracer due to all trends127 ! ------------------------------128 IF( lk_vvl ) THEN ! variable level thickness : leap-frog on tracer*e3t129 DO jk = 1, jpkm1130 DO jj = 2, jpjm1131 DO ji = fs_2, fs_jpim1 ! vector opt.132 ze3tb = fse3t_b(ji,jj,jk) / fse3t(ji,jj,jk) ! before e3t133 zta = zwx(ji,jj,jk) - tb(ji,jj,jk) + p2dt(jk) * ta(ji,jj,jk) ! total trends * 2*rdt134 zsa = zwz(ji,jj,jk) - sb(ji,jj,jk) + p2dt(jk) * sa(ji,jj,jk)135 ta(ji,jj,jk) = ( ze3tb * tb(ji,jj,jk) + zta ) * tmask(ji,jj,jk)136 sa(ji,jj,jk) = ( ze3tb * sb(ji,jj,jk) + zsa ) * tmask(ji,jj,jk)137 END DO138 END DO139 END DO140 ELSE ! fixed level thickness : leap-frog on tracers141 DO jk = 1, jpkm1142 DO jj = 2, jpjm1143 DO ji = fs_2, fs_jpim1 ! vector opt.144 ta(ji,jj,jk) = ( zwx(ji,jj,jk) + p2dt(jk) * ta(ji,jj,jk) ) * tmask(ji,jj,jk)145 sa(ji,jj,jk) = ( zwz(ji,jj,jk) + p2dt(jk) * sa(ji,jj,jk) ) * tmask(ji,jj,jk)146 END DO147 END DO148 END DO149 ENDIF150 159 ! 151 160 END SUBROUTINE tra_zdf_exp
Note: See TracChangeset
for help on using the changeset viewer.