source: branches/2016/dev_r6409_SIMPLIF_2_usrdef/NEMOGCM/CONFIG/LOCK_EXCHANGE/MY_SRC/usrdef_zgr.F90 @ 6923

Last change on this file since 6923 was 6923, checked in by gm, 4 years ago

#1692 - branch SIMPLIF_2_usrdef: update comments in usrdef modules

File size: 8.5 KB
Line 
1MODULE usrdef_zgr
2   !!======================================================================
3   !!                   ***  MODULE  usrdef_zgr  ***
4   !!
5   !!                   ===  LOCK_EXCHANGE case  ===
6   !!
7   !! Ocean domain : user defined vertical coordinate system
8   !!======================================================================
9   !! History :  4.0  ! 2016-08  (G. Madec, S. Flavoni)  Original code
10   !!----------------------------------------------------------------------
11
12   !!----------------------------------------------------------------------
13   !!   usr_def_zgr   : user defined vertical coordinate system (required)
14   !!       zgr_z1d   : reference 1D z-coordinate
15   !!---------------------------------------------------------------------
16   USE oce            ! ocean variables
17   USE dom_oce ,  ONLY: ln_zco, ln_zps, ln_sco   ! ocean space and time domain
18   USE usrdef_nam     ! User defined : namelist variables
19   !
20   USE in_out_manager ! I/O manager
21   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
22   USE lib_mpp        ! distributed memory computing library
23   USE wrk_nemo       ! Memory allocation
24   USE timing         ! Timing
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC   usr_def_zgr   ! called by domzgr.F90
30
31  !! * Substitutions
32#  include "vectopt_loop_substitute.h90"
33   !!----------------------------------------------------------------------
34   !! NEMO/OPA 4.0 , NEMO Consortium (2016)
35   !! $Id$
36   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
37   !!----------------------------------------------------------------------
38CONTAINS             
39
40   SUBROUTINE usr_def_zgr( ld_zco  , ld_zps  , ld_sco  , ld_isfcav,    &   ! type of vertical coordinate
41      &                    pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d  ,    &   ! 1D reference vertical coordinate
42      &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
43      &                    pe3t  , pe3u  , pe3v , pe3f ,               &   ! vertical scale factors
44      &                    pe3w  , pe3uw , pe3vw,                      &   !     -      -      -
45      &                    k_top  , k_bot    )                             ! top & bottom ocean level
46      !!---------------------------------------------------------------------
47      !!              ***  ROUTINE usr_def_zgr  ***
48      !!
49      !! ** Purpose :   User defined the vertical coordinates
50      !!
51      !!----------------------------------------------------------------------
52      LOGICAL                   , INTENT(out) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags
53      LOGICAL                   , INTENT(out) ::   ld_isfcav                   ! under iceshelf cavity flag
54      REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth     [m]
55      REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D grid-point depth     [m]
56      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
57      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
58      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors
59      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
60      !
61      INTEGER  ::   jk   ! dummy indices
62      REAL(wp), DIMENSION(jpi,jpj) ::   z2d   ! 2D workspace
63      !!----------------------------------------------------------------------
64      !
65      IF(lwp) WRITE(numout,*)
66      IF(lwp) WRITE(numout,*) 'usr_def_zgr : LOCK_EXCHANGE configuration (z-coordinate closed box ocean without cavities)'
67      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
68      !
69      !
70      ! type of vertical coordinate
71      ! ---------------------------
72      ! set in usrdef_nam.F90 by reading the namusr_def namelist only ln_zco
73      ln_zco    = .TRUE.       ! z-partial-step coordinate
74      ln_zps    = .FALSE.      ! z-partial-step coordinate
75      ln_sco    = .FALSE.      ! s-coordinate
76      ld_isfcav = .FALSE.      ! ISF Ice Shelves Flag
77      !
78      !
79      ! Build the vertical coordinate system
80      ! ------------------------------------
81      !
82      !                       !==  UNmasked meter bathymetry  ==!
83      !
84      ! flat bassin (20m deep and 64000m wide, set through the jpk and jpi (see userdef_nam.F90))
85      CALL zgr_z1d( pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d )   ! Reference z-coordinate system
86      !
87      !
88      !                       !==  top masked level bathymetry  ==!  (all coordinates)
89      !
90      ! no ocean cavities : top ocean level is ONE, except over land
91      ! the ocean basin surrounded by land (1 grid-point) set through lbc_lnk call as jperio=0
92      z2d(:,:) = 1._wp                    ! surface ocean is the 1st level
93      CALL lbc_lnk( z2d, 'T', 1. )        ! closed basin since jperio = 0 (see userdef_nam.F90)
94      k_top(:,:) = NINT( z2d(:,:) )
95      !
96      !                             
97      !                       !==  z-coordinate  ==!   (step-like topography)
98      !
99      !                                !* bottom ocean compute from the depth of grid-points
100      k_bot(:,:) = jpkm1 * k_top(:,:)     ! here use k_top as a land mask
101      !                                !* horizontally uniform coordinate (reference z-co everywhere)
102      DO jk = 1, jpk
103         pdept(:,:,jk) = pdept_1d(jk)
104         pdepw(:,:,jk) = pdepw_1d(jk)
105         pe3t (:,:,jk) = pe3t_1d (jk)
106         pe3u (:,:,jk) = pe3t_1d (jk)
107         pe3v (:,:,jk) = pe3t_1d (jk)
108         pe3f (:,:,jk) = pe3t_1d (jk)
109         pe3w (:,:,jk) = pe3w_1d (jk)
110         pe3uw(:,:,jk) = pe3w_1d (jk)
111         pe3vw(:,:,jk) = pe3w_1d (jk)
112      END DO
113      !
114   END SUBROUTINE usr_def_zgr
115
116
117   SUBROUTINE zgr_z1d( pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d )   ! 1D reference vertical coordinate
118      !!----------------------------------------------------------------------
119      !!                   ***  ROUTINE zgr_z1d  ***
120      !!
121      !! ** Purpose :   set the depth of model levels and the resulting
122      !!      vertical scale factors.
123      !!
124      !! ** Method  :   z-coordinate system (use in all type of coordinate)
125      !!      The depth of model levels is defined from an analytical
126      !!      function the derivative of which gives the scale factors.
127      !!      both depth and scale factors only depend on k (1d arrays).
128      !!              w-level: pdepw_1d  = pdep(k)
129      !!                       pe3w_1d(k) = dk(pdep)(k)     = e3(k)
130      !!              t-level: pdept_1d  = pdep(k+0.5)
131      !!                       pe3t_1d(k) = dk(pdep)(k+0.5) = e3(k+0.5)
132      !!
133      !!            ===    Here constant vertical resolution   ===
134      !!
135      !! ** Action  : - pdept_1d, pdepw_1d : depth of T- and W-point (m)
136      !!              - pe3t_1d , pe3w_1d  : scale factors at T- and W-levels (m)
137      !!----------------------------------------------------------------------
138      REAL(wp), DIMENSION(:), INTENT(out) ::   pdept_1d, pdepw_1d   ! 1D grid-point depth        [m]
139      REAL(wp), DIMENSION(:), INTENT(out) ::   pe3t_1d , pe3w_1d    ! 1D vertical scale factors  [m]
140      !
141      INTEGER  ::   jk       ! dummy loop indices
142      REAL(wp) ::   zt, zw   ! local scalar
143      !!----------------------------------------------------------------------
144      !
145      IF(lwp) THEN                         ! Parameter print
146         WRITE(numout,*)
147         WRITE(numout,*) '    zgr_z1d : Reference vertical z-coordinates: uniform dz = ', rn_dz
148         WRITE(numout,*) '    ~~~~~~~'
149      ENDIF
150      !
151      ! Reference z-coordinate (depth - scale factor at T- and W-points)   ! Madec & Imbard 1996 function
152      ! ----------------------
153      DO jk = 1, jpk
154         zw = REAL( jk , wp )
155         zt = REAL( jk , wp ) + 0.5_wp
156         pdepw_1d(jk) =    rn_dz *   REAL( jk-1 , wp )
157         pdept_1d(jk) =    rn_dz * ( REAL( jk-1 , wp ) + 0.5_wp )
158         pe3w_1d (jk) =    rn_dz
159         pe3t_1d (jk) =    rn_dz
160      END DO
161      !
162      IF(lwp) THEN                        ! control print
163         WRITE(numout,*)
164         WRITE(numout,*) '              Reference 1D z-coordinate depth and scale factors:'
165         WRITE(numout, "(9x,' level  gdept_1d  gdepw_1d  e3t_1d   e3w_1d  ')" )
166         WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, pdept_1d(jk), pdepw_1d(jk), pe3t_1d(jk), pe3w_1d(jk), jk = 1, jpk )
167      ENDIF
168      !
169   END SUBROUTINE zgr_z1d
170   
171   !!======================================================================
172END MODULE usrdef_zgr
Note: See TracBrowser for help on using the repository browser.