Changeset 6004 for branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_exp.F90
- Timestamp:
- 2015-12-04T17:05:58+01:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_exp.F90
r5845 r6004 8 8 !! NEMO 0.5 ! 2002-08 (G. Madec) F90: Free form and module 9 9 !! 3.3 ! 2010-04 (M. Leclair, G. Madec) Forcing averaged over 2 time steps 10 !! 3.7 ! 2015-11 (J. Chanut) output velocities instead of trends 10 11 !!---------------------------------------------------------------------- 11 12 12 13 !!---------------------------------------------------------------------- 13 !! dyn_zdf_exp : update the momentum trend with the vertical diffu-14 !! sion using an explicit time-stepping scheme.14 !! dyn_zdf_exp : update the momentum trend with the vertical diffusion using a split-explicit scheme 15 !! and perform the Leap-Frog time integration. 15 16 !!---------------------------------------------------------------------- 16 USE oce 17 USE dom_oce 18 USE phycst 19 USE zdf_oce 20 USE sbc_oce ! surface boundary condition: ocean21 USE lib_mpp ! MPP library22 USE in_out_manager ! I/O manager23 USE lib_mpp ! MPP library24 USE wrk_nemo ! Memory Allocation25 USE timing ! Timing26 17 USE oce ! ocean dynamics and tracers 18 USE dom_oce ! ocean space and time domain 19 USE phycst ! physical constants 20 USE zdf_oce ! ocean vertical physics 21 USE dynadv , ONLY: ln_dynadv_vec ! Momentum advection form 22 USE sbc_oce ! surface boundary condition: ocean 23 ! 24 USE in_out_manager ! I/O manager 25 USE lib_mpp ! MPP library 26 USE wrk_nemo ! Memory Allocation 27 USE timing ! Timing 27 28 28 29 IMPLICIT NONE … … 34 35 # include "vectopt_loop_substitute.h90" 35 36 !!---------------------------------------------------------------------- 36 !! NEMO/OPA 3. 3 , NEMO Consortium (2010)37 !! NEMO/OPA 3.7 , NEMO Consortium (2015) 37 38 !! $Id$ 38 39 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 45 46 !! 46 47 !! ** Purpose : Compute the trend due to the vert. momentum diffusion 48 !! and perform the Leap-Frog time stepping. 47 49 !! 48 !! ** Method : Explicit forward time stepping with a time splitting49 !! technique. The vertical diffusionof momentum is given by:50 !! ** Method : - Split-explicit forward time stepping. 51 !! The vertical mixing of momentum is given by: 50 52 !! diffu = dz( avmu dz(u) ) = 1/e3u dk+1( avmu/e3uw dk(ub) ) 51 53 !! Surface boundary conditions: wind stress input (averaged over kt-1/2 & kt+1/2) … … 53 55 !! Add this trend to the general trend ua : 54 56 !! ua = ua + dz( avmu dz(u) ) 57 !! - Leap-Frog time stepping (Asselin filter will be applied in dyn_nxt) 58 !! ua = ub + 2*dt * ua vector form or linear free surf. 59 !! ua = ( e3u_b*ub + 2*dt * e3u_n*ua ) / e3u_a otherwise 55 60 !! 56 !! ** Action : - Update (ua,va) with the vertical diffusive trend61 !! ** Action : - (ua,va) after velocity 57 62 !!--------------------------------------------------------------------- 58 63 INTEGER , INTENT(in) :: kt ! ocean time-step index 59 64 REAL(wp), INTENT(in) :: p2dt ! time-step 60 65 ! 61 INTEGER :: ji, jj, jk, jl ! dummy loop indices66 INTEGER :: ji, jj, jk, jl ! dummy loop indices 62 67 REAL(wp) :: zlavmr, zua, zva ! local scalars 63 68 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwx, zwy, zwz, zww 64 69 !!---------------------------------------------------------------------- 65 70 ! 66 IF( nn_timing == 1 ) CALL timing_start('dyn_zdf_exp')71 IF( nn_timing == 1 ) CALL timing_start('dyn_zdf_exp') 67 72 ! 68 CALL wrk_alloc( jpi,jpj,jpk, zwx, zwy, zwz, zww )73 CALL wrk_alloc( jpi,jpj,jpk, zwx, zwy, zwz, zww ) 69 74 ! 70 75 IF( kt == nit000 .AND. lwp ) THEN … … 73 78 WRITE(numout,*) '~~~~~~~~~~~ ' 74 79 ENDIF 75 80 ! 81 ! !== vertical mixing trend ==! 82 ! 76 83 zlavmr = 1. / REAL( nn_zdfexp ) 77 78 79 DO jj = 2, jpjm1 ! Surface boundary condition 84 ! 85 DO jj = 2, jpjm1 ! Surface boundary condition 80 86 DO ji = 2, jpim1 81 87 zwy(ji,jj,1) = ( utau_b(ji,jj) + utau(ji,jj) ) * r1_rau0 … … 83 89 END DO 84 90 END DO 85 DO jk = 1, jpk 91 DO jk = 1, jpk ! Initialization of x, z and contingently trends array 86 92 DO jj = 2, jpjm1 87 93 DO ji = 2, jpim1 … … 92 98 END DO 93 99 ! 94 DO jl = 1, nn_zdfexp 100 DO jl = 1, nn_zdfexp ! Time splitting loop 95 101 ! 96 DO jk = 2, jpk 102 DO jk = 2, jpk ! First vertical derivative 97 103 DO jj = 2, jpjm1 98 104 DO ji = 2, jpim1 … … 102 108 END DO 103 109 END DO 104 DO jk = 1, jpkm1 110 DO jk = 1, jpkm1 ! Second vertical derivative and trend estimation at kt+l*rdt/nn_zdfexp 105 111 DO jj = 2, jpjm1 106 112 DO ji = 2, jpim1 … … 115 121 END DO 116 122 END DO 117 ! 118 END DO ! End of time splitting 123 END DO ! End of time splitting 119 124 ! 120 CALL wrk_dealloc( jpi,jpj,jpk, zwx, zwy, zwz, zww )121 125 ! 122 IF( nn_timing == 1 ) CALL timing_stop('dyn_zdf_exp') 126 ! !== Leap-Frog time integration ==! 127 ! 128 IF( ln_dynadv_vec .OR. ln_linssh ) THEN ! applied on velocity 129 DO jk = 1, jpkm1 130 ua(:,:,jk) = ( ub(:,:,jk) + p2dt * ua(:,:,jk) ) * umask(:,:,jk) 131 va(:,:,jk) = ( vb(:,:,jk) + p2dt * va(:,:,jk) ) * vmask(:,:,jk) 132 END DO 133 ELSE ! applied on thickness weighted velocity 134 DO jk = 1, jpkm1 135 ua(:,:,jk) = ( e3u_b(:,:,jk) * ub(:,:,jk) & 136 & + p2dt * e3u_n(:,:,jk) * ua(:,:,jk) ) / e3u_a(:,:,jk) * umask(:,:,jk) 137 va(:,:,jk) = ( e3v_b(:,:,jk) * vb(:,:,jk) & 138 & + p2dt * e3v_n(:,:,jk) * va(:,:,jk) ) / e3v_a(:,:,jk) * vmask(:,:,jk) 139 END DO 140 ENDIF 141 ! 142 CALL wrk_dealloc( jpi,jpj,jpk, zwx, zwy, zwz, zww ) 143 ! 144 IF( nn_timing == 1 ) CALL timing_stop('dyn_zdf_exp') 123 145 ! 124 146 END SUBROUTINE dyn_zdf_exp
Note: See TracChangeset
for help on using the changeset viewer.