Changeset 2621
- Timestamp:
- 2011-02-27T11:24:06+01:00 (13 years ago)
- Location:
- branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/OPA_SRC
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_exp.F90
r2590 r2621 24 24 PRIVATE 25 25 26 PUBLIC dyn_zdf_exp ! called by step.F90 27 PUBLIC dyn_zdf_exp_alloc ! called by nemogcm.F90 28 29 ! 2D workspaces. Not replaced with wrk_nemo arrays because these 30 ! have shape (jpi,jpk). 31 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: zwx, zwy, zwz, zww 26 PUBLIC dyn_zdf_exp ! called by step.F90 32 27 33 28 !! * Substitutions … … 37 32 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 38 33 !! $Id$ 39 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)34 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 40 35 !!---------------------------------------------------------------------- 41 42 36 CONTAINS 43 44 FUNCTION dyn_zdf_exp_alloc()45 !!----------------------------------------------------------------------46 !! *** ROUTINE dyn_zdf_exp_alloc ***47 !!----------------------------------------------------------------------48 INTEGER :: dyn_zdf_exp_alloc49 !!----------------------------------------------------------------------50 51 ALLOCATE(zwx(jpi,jpk), zwy(jpi,jpk), zwz(jpi,jpk), zww(jpi,jpk), &52 Stat=dyn_zdf_exp_alloc)53 54 IF(dyn_zdf_exp_alloc /= 0)THEN55 CALL ctl_warn('dyn_zdf_exp_alloc: failed to allocate arrays.')56 END IF57 58 END FUNCTION dyn_zdf_exp_alloc59 60 37 61 38 SUBROUTINE dyn_zdf_exp( kt, p2dt ) … … 75 52 !! ** Action : - Update (ua,va) with the vertical diffusive trend 76 53 !!--------------------------------------------------------------------- 54 USE wrk_nemo, ONLY: wrk_use, wrk_release 55 USE oce , ONLY : zwx => ta , zwy => sa ! (ta,sa) used as 3D workspace 56 USE wrk_nemo, ONLY: zwz => wrk_3d_1 , zww => wrk_3d_1 ! 3D workspace 57 ! 77 58 INTEGER , INTENT(in) :: kt ! ocean time-step index 78 59 REAL(wp), INTENT(in) :: p2dt ! time-step 79 ! !60 ! 80 61 INTEGER :: ji, jj, jk, jl ! dummy loop indices 81 62 REAL(wp) :: zrau0r, zlavmr, zua, zva ! temporary scalars 82 63 !!---------------------------------------------------------------------- 83 64 84 IF( kt == nit000 ) THEN85 IF(lwp)WRITE(numout,*)86 IF(lwp)WRITE(numout,*) 'dyn_zdf_exp : vertical momentum diffusion - explicit operator'87 IF(lwp)WRITE(numout,*) '~~~~~~~~~~~ '65 IF( kt == nit000 .AND. lwp ) THEN 66 WRITE(numout,*) 67 WRITE(numout,*) 'dyn_zdf_exp : vertical momentum diffusion - explicit operator' 68 WRITE(numout,*) '~~~~~~~~~~~ ' 88 69 ENDIF 89 70 90 zrau0r = 1. / rau0 71 zrau0r = 1. / rau0 ! Local constant initialization 91 72 zlavmr = 1. / REAL( nn_zdfexp ) 92 73 93 ! ! =============== 94 DO jj = 2, jpjm1 ! Vertical slab 95 ! ! =============== 96 DO ji = 2, jpim1 ! Surface boundary condition 97 zwy(ji,1) = ( utau_b(ji,jj) + utau(ji,jj) ) * zrau0r 98 zww(ji,1) = ( vtau_b(ji,jj) + vtau(ji,jj) ) * zrau0r 74 75 DO jj = 2, jpjm1 ! Surface boundary condition 76 DO ji = 2, jpim1 77 zwy(ji,jj,1) = ( utau_b(ji,jj) + utau(ji,jj) ) * zrau0r 78 zww(ji,jj,1) = ( vtau_b(ji,jj) + vtau(ji,jj) ) * zrau0r 99 79 END DO 100 DO jk = 1, jpk ! Initialization of x, z and contingently trends array 80 END DO 81 DO jk = 1, jpk ! Initialization of x, z and contingently trends array 82 DO jj = 2, jpjm1 101 83 DO ji = 2, jpim1 102 zwx(ji,jk) = ub(ji,jj,jk) 103 zwz(ji,jk) = vb(ji,jj,jk) 84 zwx(ji,jj,jk) = ub(ji,jj,jk) 85 zwz(ji,jj,jk) = vb(ji,jj,jk) 86 END DO 87 END DO 88 END DO 89 ! 90 DO jl = 1, nn_zdfexp ! Time splitting loop 91 ! 92 DO jk = 2, jpk ! First vertical derivative 93 DO jj = 2, jpjm1 94 DO ji = 2, jpim1 95 zwy(ji,jj,jk) = avmu(ji,jj,jk) * ( zwx(ji,jj,jk-1) - zwx(ji,jj,jk) ) / fse3uw(ji,jj,jk) 96 zww(ji,jj,jk) = avmv(ji,jj,jk) * ( zwz(ji,jj,jk-1) - zwz(ji,jj,jk) ) / fse3vw(ji,jj,jk) 97 END DO 98 END DO 99 END DO 100 DO jk = 1, jpkm1 ! Second vertical derivative and trend estimation at kt+l*rdt/nn_zdfexp 101 DO jj = 2, jpjm1 102 DO ji = 2, jpim1 103 zua = zlavmr * ( zwy(ji,jj,jk) - zwy(ji,jj,jk+1) ) / fse3u(ji,jj,jk) 104 zva = zlavmr * ( zww(ji,jj,jk) - zww(ji,jj,jk+1) ) / fse3v(ji,jj,jk) 105 ua(ji,jj,jk) = ua(ji,jj,jk) + zua 106 va(ji,jj,jk) = va(ji,jj,jk) + zva 107 ! 108 zwx(ji,jj,jk) = zwx(ji,jj,jk) + p2dt * zua * umask(ji,jj,jk) 109 zwz(ji,jj,jk) = zwz(ji,jj,jk) + p2dt * zva * vmask(ji,jj,jk) 110 END DO 104 111 END DO 105 112 END DO 106 113 ! 107 DO jl = 1, nn_zdfexp ! Time splitting loop 108 ! 109 DO jk = 2, jpk ! First vertical derivative 110 DO ji = 2, jpim1 111 zwy(ji,jk) = avmu(ji,jj,jk) * ( zwx(ji,jk-1) - zwx(ji,jk) ) / fse3uw(ji,jj,jk) 112 zww(ji,jk) = avmv(ji,jj,jk) * ( zwz(ji,jk-1) - zwz(ji,jk) ) / fse3vw(ji,jj,jk) 113 END DO 114 END DO 115 DO jk = 1, jpkm1 ! Second vertical derivative and trend estimation at kt+l*rdt/nn_zdfexp 116 DO ji = 2, jpim1 117 zua = zlavmr * ( zwy(ji,jk) - zwy(ji,jk+1) ) / fse3u(ji,jj,jk) 118 zva = zlavmr * ( zww(ji,jk) - zww(ji,jk+1) ) / fse3v(ji,jj,jk) 119 ua(ji,jj,jk) = ua(ji,jj,jk) + zua 120 va(ji,jj,jk) = va(ji,jj,jk) + zva 121 ! 122 zwx(ji,jk) = zwx(ji,jk) + p2dt * zua * umask(ji,jj,jk) 123 zwz(ji,jk) = zwz(ji,jk) + p2dt * zva * vmask(ji,jj,jk) 124 END DO 125 END DO 126 ! 127 END DO 128 ! ! =============== 129 END DO ! End of slab 130 ! ! =============== 114 END DO ! End of time splitting 115 ! 131 116 END SUBROUTINE dyn_zdf_exp 132 117 -
branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/OPA_SRC/nemogcm.F90
r2620 r2621 471 471 472 472 473 USE dynzdf_exp, ONLY: dyn_zdf_exp_alloc474 473 #if defined key_mpp_mpi 475 474 USE lib_mpp, ONLY: lib_mpp_alloc … … 555 554 556 555 557 ierr = ierr + dyn_zdf_exp_alloc()558 556 #if defined key_mpp_mpi 559 557 ierr = ierr + lib_mpp_alloc()
Note: See TracChangeset
for help on using the changeset viewer.