Changeset 1870 for branches/DEV_r1837_MLF/NEMO/OPA_SRC/DYN/dynzdf_exp.F90
- Timestamp:
- 2010-05-12T17:36:00+02:00 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DEV_r1837_MLF/NEMO/OPA_SRC/DYN/dynzdf_exp.F90
r1537 r1870 4 4 !! Ocean dynamics: vertical component(s) of the momentum mixing trend 5 5 !!============================================================================== 6 !! History : ! 90-10 (B. Blanke) Original code 7 !! ! 97-05 (G. Madec) vertical component of isopycnal 8 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 6 !! History : OPA ! 1990-10 (B. Blanke) Original code 7 !! 8.0 ! 1997-05 (G. Madec) vertical component of isopycnal 8 !! NEMO 1.0 ! 1002-08 (G. Madec) F90: Free form and module 9 !! 3.3 ! 2010-04 (M. Leclair, G. Madec) Forcing averaged over 2 time steps 9 10 !!---------------------------------------------------------------------- 10 11 … … 13 14 !! sion using an explicit time-stepping scheme. 14 15 !!---------------------------------------------------------------------- 15 !! * Modules used16 16 USE oce ! ocean dynamics and tracers 17 17 USE dom_oce ! ocean space and time domain … … 24 24 PRIVATE 25 25 26 !! * Routine accessibility 27 PUBLIC dyn_zdf_exp ! called by step.F90 26 PUBLIC dyn_zdf_exp ! called by step.F90 28 27 29 28 !! * Substitutions … … 31 30 # include "vectopt_loop_substitute.h90" 32 31 !!---------------------------------------------------------------------- 33 !! OPA 9.0 , LOCEAN-IPSL (2005)32 !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010) 34 33 !! $Id$ 35 34 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) … … 47 46 !! technique. The vertical diffusion of momentum is given by: 48 47 !! diffu = dz( avmu dz(u) ) = 1/e3u dk+1( avmu/e3uw dk(ub) ) 49 !! Surface boundary conditions: wind stress input 48 !! Surface boundary conditions: wind stress input (averaged over kt-1/2 & kt+1/2) 50 49 !! Bottom boundary conditions : bottom stress (cf zdfbfr.F90) 51 50 !! Add this trend to the general trend ua : … … 54 53 !! ** Action : - Update (ua,va) with the vertical diffusive trend 55 54 !!--------------------------------------------------------------------- 56 !! * Arguments 57 INTEGER , INTENT( in ) :: kt ! ocean time-step index 58 REAL(wp), INTENT( in ) :: p2dt ! time-step 59 60 !! * Local declarations 61 INTEGER :: ji, jj, jk, jl ! dummy loop indices 62 REAL(wp) :: zrau0r, zlavmr, zua, zva ! temporary scalars 63 REAL(wp), DIMENSION(jpi,jpk) :: zwx, zwy, zwz, zww ! temporary workspace arrays 55 INTEGER , INTENT(in) :: kt ! ocean time-step index 56 REAL(wp), INTENT(in) :: p2dt ! time-step 57 !! 58 INTEGER :: ji, jj, jk, jl ! dummy loop indices 59 REAL(wp) :: zrau0r, zlavmr, zua, zva ! temporary scalars 60 REAL(wp), DIMENSION(jpi,jpk) :: zwx, zwy, zwz, zww ! 2D workspace 64 61 !!---------------------------------------------------------------------- 65 62 66 63 IF( kt == nit000 ) THEN 67 64 IF(lwp) WRITE(numout,*) 68 IF(lwp) WRITE(numout,*) 'dyn_zdf_exp : vertical momentum diffusion explicit operator'65 IF(lwp) WRITE(numout,*) 'dyn_zdf_exp : vertical momentum diffusion - explicit operator' 69 66 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 70 67 ENDIF 71 68 72 ! Local constant initialization 73 ! ----------------------------- 74 zrau0r = 1. / rau0 ! inverse of the reference density 75 zlavmr = 1. / float( nn_zdfexp ) ! inverse of the number of sub time step 69 zrau0r = 1. / rau0 ! Local constant initialization 70 zlavmr = 1. / REAL( nn_zdfexp ) 76 71 77 ! ! =============== 78 DO jj = 2, jpjm1 ! Vertical slab 79 ! ! =============== 80 81 ! Surface boundary condition 82 DO ji = 2, jpim1 83 zwy(ji,1) = utau(ji,jj) * zrau0r 84 zww(ji,1) = vtau(ji,jj) * zrau0r 72 ! ! =============== 73 DO jj = 2, jpjm1 ! Vertical slab 74 ! ! =============== 75 DO ji = 2, jpim1 ! Surface boundary condition 76 zwy(ji,1) = ( utau_b(ji,jj) + utau(ji,jj) ) * zrau0r 77 zww(ji,1) = ( vtau_b(ji,jj) + vtau(ji,jj) ) * zrau0r 85 78 END DO 86 87 ! Initialization of x, z and contingently trends array 88 DO jk = 1, jpk 79 DO jk = 1, jpk ! Initialization of x, z and contingently trends array 89 80 DO ji = 2, jpim1 90 81 zwx(ji,jk) = ub(ji,jj,jk) … … 92 83 END DO 93 84 END DO 94 95 ! Time splitting loop 96 DO jl = 1, nn_zdfexp 97 98 ! First vertical derivative 99 DO jk = 2, jpk 85 ! 86 DO jl = 1, nn_zdfexp ! Time splitting loop 87 ! 88 DO jk = 2, jpk ! First vertical derivative 100 89 DO ji = 2, jpim1 101 90 zwy(ji,jk) = avmu(ji,jj,jk) * ( zwx(ji,jk-1) - zwx(ji,jk) ) / fse3uw(ji,jj,jk) … … 103 92 END DO 104 93 END DO 105 106 ! Second vertical derivative and trend estimation at kt+l*rdt/nn_zdfexp 107 DO jk = 1, jpkm1 94 DO jk = 1, jpkm1 ! Second vertical derivative and trend estimation at kt+l*rdt/nn_zdfexp 108 95 DO ji = 2, jpim1 109 zua = zlavmr *( zwy(ji,jk) - zwy(ji,jk+1) ) / fse3u(ji,jj,jk)110 zva = zlavmr *( zww(ji,jk) - zww(ji,jk+1) ) / fse3v(ji,jj,jk)96 zua = zlavmr * ( zwy(ji,jk) - zwy(ji,jk+1) ) / fse3u(ji,jj,jk) 97 zva = zlavmr * ( zww(ji,jk) - zww(ji,jk+1) ) / fse3v(ji,jj,jk) 111 98 ua(ji,jj,jk) = ua(ji,jj,jk) + zua 112 99 va(ji,jj,jk) = va(ji,jj,jk) + zva 113 114 zwx(ji,jk) = zwx(ji,jk) + p2dt *zua*umask(ji,jj,jk)115 zwz(ji,jk) = zwz(ji,jk) + p2dt *zva*vmask(ji,jj,jk)100 ! 101 zwx(ji,jk) = zwx(ji,jk) + p2dt * zua * umask(ji,jj,jk) 102 zwz(ji,jk) = zwz(ji,jk) + p2dt * zva * vmask(ji,jj,jk) 116 103 END DO 117 104 END DO 118 105 ! 119 106 END DO 120 121 ! ! =============== 122 END DO ! End of slab 123 ! ! =============== 124 107 ! ! =============== 108 END DO ! End of slab 109 ! ! =============== 125 110 END SUBROUTINE dyn_zdf_exp 126 111
Note: See TracChangeset
for help on using the changeset viewer.