New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
zdfevd.F90 in trunk/NEMOGCM/NEMO/OPA_SRC/ZDF – NEMO

source: trunk/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90 @ 7698

Last change on this file since 7698 was 7698, checked in by mocavero, 7 years ago

update trunk with OpenMP parallelization

  • Property svn:keywords set to Id
File size: 6.6 KB
RevLine 
[3]1MODULE zdfevd
2   !!======================================================================
3   !!                       ***  MODULE  zdfevd  ***
4   !! Ocean physics: parameterization of convection through an enhancement
5   !!                of vertical eddy mixing coefficient
6   !!======================================================================
[1438]7   !! History :  OPA  !  1997-06  (G. Madec, A. Lazar)  Original code
8   !!   NEMO     1.0  !  2002-06  (G. Madec)  F90: Free form and module
9   !!            3.2  !  2009-03  (M. Leclair, G. Madec, R. Benshila) test on both before & after
10   !!----------------------------------------------------------------------
[3]11
12   !!----------------------------------------------------------------------
[5836]13   !!   zdf_evd       : increase the momentum and tracer Kz at the location of
14   !!                   statically unstable portion of the water column (ln_zdfevd=T)
[3]15   !!----------------------------------------------------------------------
16   USE oce             ! ocean dynamics and tracers variables
17   USE dom_oce         ! ocean space and time domain variables
18   USE zdf_oce         ! ocean vertical physics variables
[7646]19   USE trd_oce         ! trends: ocean variables
20   USE trdtra          ! trends manager: tracers
[5836]21   !
[3]22   USE in_out_manager  ! I/O manager
[1482]23   USE iom             ! for iom_put
[3]24   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
[5836]25   USE wrk_nemo        ! work arrays
[3294]26   USE timing          ! Timing
[3]27
28   IMPLICIT NONE
29   PRIVATE
30
[1438]31   PUBLIC   zdf_evd    ! called by step.F90
[3]32
33   !!----------------------------------------------------------------------
[2715]34   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
[1438]35   !! $Id$
[2715]36   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[3]37   !!----------------------------------------------------------------------
38CONTAINS
39
40   SUBROUTINE zdf_evd( kt )
41      !!----------------------------------------------------------------------
42      !!                  ***  ROUTINE zdf_evd  ***
43      !!                   
44      !! ** Purpose :   Local increased the vertical eddy viscosity and diffu-
45      !!      sivity coefficients when a static instability is encountered.
46      !!
[1546]47      !! ** Method  :   avt, avm, and the 4 neighbouring avmu, avmv coefficients
[3]48      !!      are set to avevd (namelist parameter) if the water column is
49      !!      statically unstable (i.e. if rn2 < -1.e-12 )
50      !!
[1546]51      !! ** Action  :   avt, avm, avmu, avmv updted in static instability cases
52      !!
[1438]53      !! References :   Lazar, A., these de l'universite Paris VI, France, 1997
[3]54      !!----------------------------------------------------------------------
[2715]55      INTEGER, INTENT( in ) ::   kt   ! ocean time-step indexocean time step
56      !
57      INTEGER ::   ji, jj, jk   ! dummy loop indices
[5836]58      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zavt_evd, zavm_evd
[3]59      !!----------------------------------------------------------------------
[3294]60      !
61      IF( nn_timing == 1 )  CALL timing_start('zdf_evd')
62      !
[3]63      IF( kt == nit000 ) THEN
64         IF(lwp) WRITE(numout,*)
65         IF(lwp) WRITE(numout,*) 'zdf_evd : Enhanced Vertical Diffusion (evd)'
66         IF(lwp) WRITE(numout,*) '~~~~~~~ '
67         IF(lwp) WRITE(numout,*)
68      ENDIF
[5836]69      !
70      CALL wrk_alloc( jpi,jpj,jpk,   zavt_evd, zavm_evd ) 
71      !
[7698]72!$OMP PARALLEL DO schedule(static) private(jk, jj, ji)
73      DO jk = 1, jpk
74         DO jj = 1, jpj
75            DO ji = 1, jpi
76               zavt_evd(ji,jj,jk) = avt(ji,jj,jk)           ! set avt prior to evd application
77            END DO
78         END DO
79      END DO 
[5836]80      !
[1537]81      SELECT CASE ( nn_evdm )
[2715]82      !
[3]83      CASE ( 1 )           ! enhance vertical eddy viscosity and diffusivity (if rn2<-1.e-12)
[2715]84         !
[7698]85!$OMP PARALLEL
86!$OMP DO schedule(static) private(jk, jj, ji)
87         DO jk = 1, jpk
88            DO jj = 1, jpj
89               DO ji = 1, jpi
90                  zavm_evd(ji,jj,jk) = avm(ji,jj,jk)           ! set avm prior to evd application
91               END DO
92            END DO
93         END DO 
[1681]94         !
[7698]95!$OMP DO schedule(static) private(jk, jj, ji)
[1546]96         DO jk = 1, jpkm1 
[3]97            DO jj = 2, jpj             ! no vector opt.
98               DO ji = 2, jpi
[2715]99                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN
[1537]100                     avt (ji  ,jj  ,jk) = rn_avevd * tmask(ji  ,jj  ,jk)
101                     avm (ji  ,jj  ,jk) = rn_avevd * tmask(ji  ,jj  ,jk)
102                     avmu(ji  ,jj  ,jk) = rn_avevd * umask(ji  ,jj  ,jk)
103                     avmu(ji-1,jj  ,jk) = rn_avevd * umask(ji-1,jj  ,jk)
104                     avmv(ji  ,jj  ,jk) = rn_avevd * vmask(ji  ,jj  ,jk)
105                     avmv(ji  ,jj-1,jk) = rn_avevd * vmask(ji  ,jj-1,jk)
[3]106                  ENDIF
107               END DO
108            END DO
[1546]109         END DO 
[7698]110!$OMP END PARALLEL
[2715]111         CALL lbc_lnk( avt , 'W', 1. )   ;   CALL lbc_lnk( avm , 'W', 1. )   ! Lateral boundary conditions
[1546]112         CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )
113         !
[7698]114!$OMP PARALLEL DO schedule(static) private(jk, jj, ji)
115         DO jk = 1, jpk
116            DO jj = 1, jpj
117               DO ji = 1, jpi
118                  zavm_evd(ji,jj,jk) = avm(ji,jj,jk) - zavm_evd(ji,jj,jk)   ! change in avm due to evd
119               END DO
120            END DO
121         END DO
[1681]122         CALL iom_put( "avm_evd", zavm_evd )              ! output this change
123         !
[3]124      CASE DEFAULT         ! enhance vertical eddy diffusivity only (if rn2<-1.e-12)
[7698]125!$OMP PARALLEL DO schedule(static) private(jk, jj, ji)
[1546]126         DO jk = 1, jpkm1
127!!!         WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd   ! agissant sur T SEUL!
[3]128            DO jj = 1, jpj             ! loop over the whole domain (no lbc_lnk call)
129               DO ji = 1, jpi
[2715]130                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 )   &
[1537]131                     avt(ji,jj,jk) = rn_avevd * tmask(ji,jj,jk)
[3]132               END DO
133            END DO
[1546]134         END DO
135         !
[3]136      END SELECT 
137
[7698]138!$OMP PARALLEL DO schedule(static) private(jk, jj, ji)
139      DO jk = 1, jpk
140         DO jj = 1, jpj
141            DO ji = 1, jpi
142               zavt_evd(ji,jj,jk) = avt(ji,jj,jk) - zavt_evd(ji,jj,jk)   ! change in avt due to evd
143            END DO
144         END DO
145      END DO
[1681]146      CALL iom_put( "avt_evd", zavt_evd )              ! output this change
[7646]147      IF( l_trdtra ) CALL trd_tra( kt, 'TRA', jp_tem, jptra_evd, zavt_evd )
[1546]148      !
[5836]149      CALL wrk_dealloc( jpi,jpj,jpk,   zavt_evd, zavm_evd ) 
150      !
[3294]151      IF( nn_timing == 1 )  CALL timing_stop('zdf_evd')
152      !
[3]153   END SUBROUTINE zdf_evd
154
155   !!======================================================================
156END MODULE zdfevd
Note: See TracBrowser for help on using the repository browser.