Changeset 14428
- Timestamp:
- 2021-02-10T19:12:36+01:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2021/dev_r14318_RK3_stage1/src/OCE/DYN/dynzad.F90
r14072 r14428 4 4 !! Ocean dynamics : vertical advection trend 5 5 !!====================================================================== 6 !! History : OPA ! 1991-01 (G. Madec) Original code 7 !! NEMO 0.5 ! 2002-07 (G. Madec) Free form, F90 6 !! History : OPA ! 1991-01 (G. Madec) Original code 7 !! NEMO 0.5 ! 2002-07 (G. Madec) Free form, F90 8 !! 4.5 ! 2021-01 (S. Techene, G. Madec) memory optimization 8 9 !!---------------------------------------------------------------------- 9 10 … … 54 55 !! - Send the trends to trddyn for diagnostics (l_trddyn=T) 55 56 !!---------------------------------------------------------------------- 56 INTEGER , INTENT( in ) :: kt ! ocean time-step inedx 57 INTEGER , INTENT( in ) :: Kmm, Krhs ! ocean time level indices 58 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 57 INTEGER , INTENT(in ) :: kt, Kmm, Krhs ! ocean time-step & time-level indices 58 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 59 59 ! 60 60 INTEGER :: ji, jj, jk ! dummy loop indices 61 REAL(wp) :: z ua, zva! local scalars62 REAL(wp) , DIMENSION(jpi,jpj) :: zww63 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zwuw, zwvw64 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdu, ztrdv 61 REAL(wp) :: zWf, zWfi, zzWfu, zzWdzU ! local scalars 62 REAL(wp) :: zWfj, zzWfv, zzWdzV ! - - 63 REAL(wp), DIMENSION(A2D(0)) :: zWdzU, zWdzV ! 2D inner workspace 64 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdu, ztrdv ! 3D workspace 65 65 !!---------------------------------------------------------------------- 66 66 ! … … 71 71 IF(lwp) WRITE(numout,*) 'dyn_zad : 2nd order vertical advection scheme' 72 72 ENDIF 73 73 ! 74 74 IF( l_trddyn ) THEN ! Save puu(:,:,:,Krhs) and pvv(:,:,:,Krhs) trends 75 75 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) … … 77 77 ztrdv(:,:,:) = pvv(:,:,:,Krhs) 78 78 ENDIF 79 80 DO jk = 2, jpkm1 ! Vertical momentum advection at level w and u- and v- vertical81 DO_2D( 0, 1, 0, 1 ) ! vertical fluxes82 IF( ln_vortex_force ) THEN83 zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ( ww(ji,jj,jk) + wsd(ji,jj,jk) )84 ELSE85 zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk)86 ENDIF87 END_2D88 DO_2D( 0, 0, 0, 0 ) ! vertical momentum advection at w-point89 zwuw(ji,jj,jk) = ( zww(ji+1,jj ) + zww(ji,jj) ) * ( puu(ji,jj,jk-1,Kmm) - puu(ji,jj,jk,Kmm) )90 zwvw(ji,jj,jk) = ( zww(ji ,jj+1) + zww(ji,jj) ) * ( pvv(ji,jj,jk-1,Kmm) - pvv(ji,jj,jk,Kmm) )91 END_2D92 END DO93 79 ! 94 ! Surface and bottom advective fluxes set to zero 95 DO_2D( 0, 0, 0, 0 ) 96 zwuw(ji,jj, 1 ) = 0._wp 97 zwvw(ji,jj, 1 ) = 0._wp 98 zwuw(ji,jj,jpk) = 0._wp 99 zwvw(ji,jj,jpk) = 0._wp 100 END_2D 80 ! !== vertical momentum advection ==! at u- and v-points 101 81 ! 102 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! Vertical momentum advection at u- and v-points 103 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) & 104 & / e3u(ji,jj,jk,Kmm) 105 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) & 106 & / e3v(ji,jj,jk,Kmm) 82 zWdzU(A2D(0)) = 0._wp ! set surface (jk=1) vertical advection to zero 83 zWdzV(A2D(0)) = 0._wp 84 ! 85 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 86 ! ! vertical transport at jk+1 uw/vw-level (x2): 2*mi/j[e1e2t*(We)] 87 IF( ln_vortex_force ) THEN ! We = ww+wsd 88 zWf = e1e2t(ji ,jj ) * ( ww(ji ,jj ,jk+1) + wsd(ji ,jj ,jk+1) ) 89 zWfi = e1e2t(ji+1,jj ) * ( ww(ji+1,jj ,jk+1) + wsd(ji+1,jj ,jk+1) ) 90 zWfj = e1e2t(ji ,jj+1) * ( ww(ji ,jj+1,jk+1) + wsd(ji ,jj+1,jk+1) ) 91 ELSE ! We = ww 92 zWf = e1e2t(ji ,jj ) * ww(ji ,jj ,jk+1) 93 zWfi = e1e2t(ji+1,jj ) * ww(ji+1,jj ,jk+1) 94 zWfj = e1e2t(ji ,jj+1) * ww(ji ,jj+1,jk+1) 95 ENDIF 96 zzWfu = zWfi + zWf ! averaging at uw- and vw-points (x2) 97 zzWfv = zWfj + zWf 98 ! ! vertical advection at jk+1 uw-level (x4): zzWfu/v*dk+1[u/v] 99 zzWdzU = zzWfu * ( puu(ji,jj,jk,Kmm) - puu(ji,jj,jk+1,Kmm) ) 100 zzWdzV = zzWfv * ( pvv(ji,jj,jk,Kmm) - pvv(ji,jj,jk+1,Kmm) ) 101 ! 102 ! ! vertical advection at jk u/v-level 103 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - 0.25_wp * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm) & 104 & * ( zWdzU(ji,jj) + zzWdzU ) 105 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - 0.25_wp * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm) & 106 & * ( zWdzV(ji,jj) + zzWdzV ) 107 ! 108 IF( jk /= jpkm1 ) THEN ! save for next level computation 109 zWdzU(ji,jj) = zzWdzU 110 zWdzV(ji,jj) = zzWdzV 111 ENDIF 112 ! 107 113 END_3D 108 114 ! 109 115 IF( l_trddyn ) THEN ! save the vertical advection trends for diagnostic 110 116 ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:)
Note: See TracChangeset
for help on using the changeset viewer.