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.
usrdef_zgr.F90 in NEMO/branches/2020/dev_r12527_Gurvan_ShallowWater/cfgs/AM98/MY_SRC – NEMO

source: NEMO/branches/2020/dev_r12527_Gurvan_ShallowWater/cfgs/AM98/MY_SRC/usrdef_zgr.F90 @ 12614

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

first Shallow Water Eq. update

File size: 13.2 KB
Line 
1MODULE usrdef_zgr
2   !!======================================================================
3   !!                       ***  MODULE  usrdef_zgr  ***
4   !!
5   !!                       ===  GYRE configuration  ===
6   !!
7   !! User defined : vertical coordinate system of a user configuration
8   !!======================================================================
9   !! History :  4.0  ! 2016-06  (G. Madec)  Original code
10   !!----------------------------------------------------------------------
11
12   !!----------------------------------------------------------------------
13   !!   usr_def_zgr   : user defined vertical coordinate system
14   !!      zgr_z      : reference 1D z-coordinate
15   !!      zgr_top_bot: ocean top and bottom level indices
16   !!      zgr_zco    : 3D verticl coordinate in pure z-coordinate case
17   !!---------------------------------------------------------------------
18   USE oce            ! ocean variables
19   USE dom_oce        ! ocean domain
20   USE depth_e3       ! depth <=> e3
21   USE usrdef_nam
22   !
23   USE in_out_manager ! I/O manager
24   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
25   USE lib_mpp        ! distributed memory computing library
26
27   IMPLICIT NONE
28   PRIVATE
29
30   PUBLIC   usr_def_zgr        ! called by domzgr.F90
31
32   !!----------------------------------------------------------------------
33   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
34   !! $Id: usrdef_zgr.F90 10425 2018-12-19 21:54:16Z smasson $
35   !! Software governed by the CeCILL license (see ./LICENSE)
36   !!----------------------------------------------------------------------
37CONTAINS             
38
39   SUBROUTINE usr_def_zgr( ld_zco  , ld_zps  , ld_sco  , ld_isfcav,    &   ! type of vertical coordinate
40      &                    pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d  ,    &   ! 1D reference vertical coordinate
41      &                    pdept , pdepw ,                             &   ! 3D t & w-points depth
42      &                    pe3t  , pe3u  , pe3v   , pe3f ,             &   ! vertical scale factors
43      &                    pe3w  , pe3uw , pe3vw         ,             &   !     -      -      -
44      &                    k_top , k_bot                 )                 ! top & bottom ocean level
45      !!---------------------------------------------------------------------
46      !!              ***  ROUTINE usr_def_zgr  ***
47      !!
48      !! ** Purpose :   User defined the vertical coordinates
49      !!
50      !!----------------------------------------------------------------------
51      LOGICAL                   , INTENT(out) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags
52      LOGICAL                   , INTENT(out) ::   ld_isfcav                   ! under iceshelf cavity flag
53      REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth     [m]
54      REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D grid-point depth     [m]
55      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
56      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
57      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors
58      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
59      !
60      INTEGER  ::   inum   ! local logical unit
61      REAL(WP) ::   z_zco, z_zps, z_sco, z_cav
62      REAL(wp), DIMENSION(jpi,jpj) ::   z2d   ! 2D workspace
63      !!----------------------------------------------------------------------
64      !
65      IF(lwp) WRITE(numout,*)
66      IF(lwp) WRITE(numout,*) 'usr_def_zgr : GYRE configuration (z-coordinate closed flat box ocean without cavities)'
67      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
68      !
69      !
70      ! type of vertical coordinate
71      ! ---------------------------
72      ld_zco    = .FALSE.         ! GYRE case:  z-coordinate without ocean cavities
73      ld_zps    = .FALSE.
74      ld_sco    = .TRUE.
75      ld_isfcav = .FALSE.
76      !
77      !
78      ! Build the vertical coordinate system
79      ! ------------------------------------
80      CALL zgr_z( pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d )   ! Reference z-coordinate system
81      !
82      CALL zgr_msk_top_bot( k_top , k_bot)                 ! masked top and bottom ocean t-level indices
83      !
84      !                                                     ! z-coordinate (3D arrays) from the 1D z-coord.
85      CALL zgr_zco( pdept_1d, pdepw_1d, pe3t_1d, pe3w_1d,   &   ! in  : 1D reference vertical coordinate
86         &          pdept   , pdepw   ,                     &   ! out : 3D t & w-points depth
87         &          pe3t    , pe3u    , pe3v   , pe3f   ,   &   !       vertical scale factors
88         &          pe3w    , pe3uw   , pe3vw             )     !           -      -      -
89      !
90   END SUBROUTINE usr_def_zgr
91
92
93   SUBROUTINE zgr_z( pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d )   ! 1D reference vertical coordinate
94      !!----------------------------------------------------------------------
95      !!                   ***  ROUTINE zgr_z  ***
96      !!
97      !! ** Purpose :   set the 1D depth of model levels and the resulting
98      !!              vertical scale factors.
99      !!
100      !! ** Method  :   1D z-coordinate system (use in all type of coordinate)
101      !!       The depth of model levels is set from dep(k), an analytical function:
102      !!                   w-level: depw_1d  = dep(k)
103      !!                   t-level: dept_1d  = dep(k+0.5)
104      !!       The scale factors are the discrete derivative of the depth:
105      !!                   e3w_1d(jk) = dk[ dept_1d ]
106      !!                   e3t_1d(jk) = dk[ depw_1d ]
107      !!           with at top and bottom :
108      !!                   e3w_1d( 1 ) = 2 * ( dept_1d( 1 ) - depw_1d( 1 ) )
109      !!                   e3t_1d(jpk) = 2 * ( dept_1d(jpk) - depw_1d(jpk) )
110      !!       The depth are then re-computed from the sum of e3. This ensures
111      !!    that depths are identical when reading domain configuration file.
112      !!    Indeed, only e3. are saved in this file, depth are compute by a call
113      !!    to the e3_to_depth subroutine.
114      !!
115      !!       Here the Madec & Imbard (1996) function is used.
116      !!
117      !! ** Action  : - pdept_1d, pdepw_1d : depth of T- and W-point (m)
118      !!              - pe3t_1d , pe3w_1d  : scale factors at T- and W-levels (m)
119      !!
120      !! Reference : Marti, Madec & Delecluse, 1992, JGR, 97, No8, 12,763-12,766.
121      !!             Madec and Imbard, 1996, Clim. Dyn.
122      !!----------------------------------------------------------------------
123      REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d   ! 1D grid-point depth        [m]
124      REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d    ! 1D vertical scale factors  [m]
125      !
126      INTEGER  ::   jk       ! dummy loop indices
127        !!----------------------------------------------------------------------
128      !
129        !
130      IF(lwp) THEN            ! Parameter print
131         WRITE(numout,*)
132         WRITE(numout,*) '    zgr_z   : Reference vertical z-coordinates '
133         WRITE(numout,*) '    ~~~~~~~'
134      ENDIF
135
136      !
137      ! 1D Reference z-coordinate    (using Madec & Imbard 1996 function)
138      ! -------------------------
139      !
140      ! depth at T and W-points
141      pdepw_1d(1) =   0._wp
142      pdept_1d(1) = 250._wp
143     
144      pdepw_1d(2) = 500._wp
145      pdept_1d(2) = 750._wp
146
147      !
148      !                       ! e3t and e3w from depth
149      CALL depth_to_e3( pdept_1d, pdepw_1d, pe3t_1d, pe3w_1d ) 
150      !
151      !                       ! recompute depths from SUM(e3)  <== needed
152      CALL e3_to_depth( pe3t_1d, pe3w_1d, pdept_1d, pdepw_1d ) 
153      !
154      IF(lwp) THEN                        ! control print
155         WRITE(numout,*)
156         WRITE(numout,*) '              Reference 1D z-coordinate depth and scale factors:'
157         WRITE(numout, "(9x,' level  gdept_1d  gdepw_1d  e3t_1d   e3w_1d  ')" )
158         WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, pdept_1d(jk), pdepw_1d(jk), pe3t_1d(jk), pe3w_1d(jk), jk = 1, jpk )
159      ENDIF
160      !
161   END SUBROUTINE zgr_z
162
163
164
165
166   SUBROUTINE zgr_msk_top_bot( k_top , k_bot)
167      !!----------------------------------------------------------------------
168      !!                    ***  ROUTINE zgr_msk_top_bot  ***
169      !!
170      !! ** Purpose :   set the masked top and bottom ocean t-levels
171      !!
172      !! ** Method  :   GYRE case = closed flat box ocean without ocean cavities
173      !!                   k_top = 1     except along north, south, east and west boundaries
174      !!                   k_bot = jpk-1 except along north, south, east and west boundaries
175      !!
176      !! ** Action  : - k_top : first wet ocean level index
177      !!              - k_bot : last  wet ocean level index
178      !!----------------------------------------------------------------------
179      INTEGER , DIMENSION(:,:), INTENT(out) ::   k_top , k_bot   ! first & last wet ocean level
180      !
181      REAL(wp), DIMENSION(jpi,jpj) ::   z2d   ! 2D local workspace
182      INTEGER  ::   ji, jj                    ! dummy loop indices
183      REAL(wp) ::   zylim0, zylim1, zxlim0, zxlim1 ! limit of the domain [m]
184      !!----------------------------------------------------------------------
185      !
186      IF(lwp) WRITE(numout,*)
187      IF(lwp) WRITE(numout,*) '    zgr_top_bot : defines the top and bottom wet ocean levels.'
188      IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~'
189      IF(lwp) WRITE(numout,*) '       GYRE case : closed flat box ocean without ocean cavities'
190      !
191      z2d(:,:) = REAL( jpkm1 , wp )          ! flat bottom
192      !
193      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1. )           ! set surrounding land to zero (here jperio=0 ==>> closed)
194      !
195
196      ! rotated domain (45deg)
197      !zylim0 =  100000._wp * SQRT( 2._wp ) / 3    !  dy*sqrt(2)/2 * 2/3
198      !zylim1 = 2000000._wp - zylim0               !  2000km - dy*sqrt(2)/2 * 2/3
199      !zxlim0 =  100000._wp * SQRT( 2._wp ) / 3    !  dx*sqrt(2)/2 * 2/3
200      !zxlim1 = 2000000._wp - zxlim0               !  2000km - dx*sqrt(2)/2 * 2/3
201     
202      ! rotated domain
203      !zylim0 =   10000._wp / REAL( nn_AM98, wp)      ! dy/10
204      !zylim1 = 2000000._wp + zylim0                  ! 2000km + dy/10
205      !zxlim0 =   10000._wp / REAL( nn_AM98, wp)      ! dx/10
206      !zxlim1 = 2000000._wp + zxlim0                  ! 2000km + dx/10
207
208      !
209      zylim0 =   10000._wp    ! +10km
210      zylim1 = 2010000._wp    ! 2010km
211      zxlim0 =   10000._wp    ! +10km
212      zxlim1 = 2010000._wp    ! 2010km
213
214      DO jj = 1, jpj
215         DO ji = 1, jpi
216         
217         ! if T point in the 2000 km x 2000 km domain
218         ! IF ( gphit(ji,jj) > zylim0 .AND. gphit(ji,jj) < zylim1 .AND. &
219         !   & glamt(ji,jj) > zxlim0 .AND. glamt(ji,jj) < zxlim1       )  THEN
220         ! if U,V points are in the 2000 km x 2000 km domain
221         IF ( gphiv(ji,jj) > zylim0 .AND. gphiv(ji,jj) < zylim1 .AND. & 
222            & glamu(ji,jj) > zxlim0 .AND. glamu(ji,jj) < zxlim1       )  THEN
223         k_top(ji,jj) = 1    ! = ocean
224         k_bot(ji,jj) = NINT( z2d(ji,jj) )
225         ELSE
226         k_top(ji,jj) = 0    ! = land
227         k_bot(ji,jj) = 0
228         END IF
229
230         END DO
231      END DO
232
233      ! k_bot(:,:) = NINT( z2d(:,:) )           ! =jpkm1 over the ocean point, =0 elsewhere
234      !
235      ! k_top(:,:) = MIN( 1 , k_bot(:,:) )      ! = 1    over the ocean point, =0 elsewhere
236      !
237   END SUBROUTINE zgr_msk_top_bot
238   
239
240   SUBROUTINE zgr_zco( pdept_1d, pdepw_1d, pe3t_1d, pe3w_1d,   &   ! in : 1D reference vertical coordinate
241      &                pdept   , pdepw   ,                     &   ! out: 3D t & w-points depth
242      &                pe3t    , pe3u    , pe3v   , pe3f   ,   &   !      vertical scale factors
243      &                pe3w    , pe3uw   , pe3vw             )     !          -      -      -
244      !!----------------------------------------------------------------------
245      !!                  ***  ROUTINE zgr_zco  ***
246      !!
247      !! ** Purpose :   define the reference z-coordinate system
248      !!
249      !! ** Method  :   set 3D coord. arrays to reference 1D array
250      !!----------------------------------------------------------------------
251      REAL(wp), DIMENSION(:)    , INTENT(in   ) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth       [m]
252      REAL(wp), DIMENSION(:)    , INTENT(in   ) ::   pe3t_1d , pe3w_1d           ! 1D vertical scale factors [m]
253      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pdept, pdepw                ! grid-point depth          [m]
254      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors    [m]
255      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pe3w , pe3uw, pe3vw         !    -       -      -
256      !
257      INTEGER  ::   jk
258      !!----------------------------------------------------------------------
259      !
260      DO jk = 1, jpk
261         pdept(:,:,jk) = pdept_1d(jk)
262         pdepw(:,:,jk) = pdepw_1d(jk)
263         pe3t (:,:,jk) = pe3t_1d (jk)
264         pe3u (:,:,jk) = pe3t_1d (jk)
265         pe3v (:,:,jk) = pe3t_1d (jk)
266         pe3f (:,:,jk) = pe3t_1d (jk)
267         pe3w (:,:,jk) = pe3w_1d (jk)
268         pe3uw(:,:,jk) = pe3w_1d (jk)
269         pe3vw(:,:,jk) = pe3w_1d (jk)
270      END DO
271      !
272   END SUBROUTINE zgr_zco
273
274   !!======================================================================
275END MODULE usrdef_zgr
Note: See TracBrowser for help on using the repository browser.