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.
domrea.F90 in branches/DEV_r2006_merge_TRA_TRC/NEMO/OFF_SRC – NEMO

source: branches/DEV_r2006_merge_TRA_TRC/NEMO/OFF_SRC/domrea.F90 @ 2053

Last change on this file since 2053 was 2053, checked in by cetlod, 14 years ago

improve the offline part to take into account the merge of TRA-TRC, see ticket:702

File size: 14.4 KB
Line 
1MODULE domrea
2   !!======================================================================
3   !!                       ***  MODULE domrea  ***
4   !! Ocean initialization : read the ocean domain meshmask file(s)
5   !!======================================================================
6
7   !!----------------------------------------------------------------------
8   !!   dom_rea        : read mesh and mask file(s)
9   !!                    nmsh = 1  :   mesh_mask file
10   !!                         = 2  :   mesh and mask file
11   !!                         = 3  :   mesh_hgr, mesh_zgr and mask
12   !!----------------------------------------------------------------------
13   !! * Modules used
14   USE dom_oce         ! ocean space and time domain
15   USE dommsk 
16   USE in_out_manager
17
18   IMPLICIT NONE
19   PRIVATE
20
21   !! * Accessibility
22   PUBLIC dom_rea        ! routine called by inidom.F90
23   !!----------------------------------------------------------------------
24   !!   OPA 9.0 , LOCEAN-IPSL  (2005)
25   !!   $Id: domrea.F90 1953 2010-06-24 15:27:10Z acc $
26   !!   This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
27   !!----------------------------------------------------------------------
28
29CONTAINS
30
31#if ( defined key_mpp_mpi || defined key_mpp_shmem ) && defined key_dimgout
32   !!----------------------------------------------------------------------
33   !!   'key_mpp_mpi'     OR
34   !!   'key_mpp_shmem'
35   !!   'key_dimgout' :         each processor makes its own direct access file
36   !!                      use build_nc_meshmask off line to retrieve
37   !!                      a ioipsl compliant meshmask file
38   !!----------------------------------------------------------------------
39#  include "domrea_dimg.h90"
40
41
42#else
43   !!----------------------------------------------------------------------
44   !!   Default option :                                        NetCDF file
45   !!----------------------------------------------------------------------
46
47   SUBROUTINE dom_rea
48      !!----------------------------------------------------------------------
49      !!                  ***  ROUTINE dom_rea  ***
50      !!                   
51      !! ** Purpose :  Read the NetCDF file(s) which contain(s) all the
52      !!      ocean domain informations (mesh and mask arrays). This (these)
53      !!      file(s) is (are) used for visualisation (SAXO software) and
54      !!      diagnostic computation.
55      !!
56      !! ** Method  :   Read in a file all the arrays generated in routines
57      !!      domhgr, domzgr, and dommsk. Note: the file contain depends on
58      !!      the vertical coord. used (z-coord, partial steps, s-coord)
59      !!                    nmsh = 1  :   'mesh_mask.nc' file
60      !!                         = 2  :   'mesh.nc' and mask.nc' files
61      !!                         = 3  :   'mesh_hgr.nc', 'mesh_zgr.nc' and
62      !!                                  'mask.nc' files
63      !!      For huge size domain, use option 2 or 3 depending on your
64      !!      vertical coordinate.
65      !!
66      !! ** input file :
67      !!      meshmask.nc  : domain size, horizontal grid-point position,
68      !!                     masks, depth and vertical scale factors
69      !!
70      !! History :
71      !!        !  97-02  (G. Madec)  Original code
72      !!        !  99-11  (M. Imbard)  NetCDF FORMAT with IOIPSL
73      !!   9.0  !  02-08  (G. Madec)  F90 and several file
74      !!        !  06-07  (C. Ethe )  Use of iom module
75      !!----------------------------------------------------------------------
76      !! * Modules used
77      USE iom
78
79      !! * Local declarations
80      INTEGER  ::   ji, jj, jk
81      INTEGER  ::                & !!! * temprary units for :
82         inum0 ,                 &  ! 'mesh_mask.nc' file
83         inum1 ,                 &  ! 'mesh.nc'      file
84         inum2 ,                 &  ! 'mask.nc'      file
85         inum3 ,                 &  ! 'mesh_hgr.nc'  file
86         inum4                      ! 'mesh_zgr.nc'  file
87 
88      REAL(wp), DIMENSION(jpi,jpj) :: &
89         zprt
90#if ! defined key_zco
91      INTEGER :: ik
92#endif
93      !!----------------------------------------------------------------------
94
95       IF(lwp) WRITE(numout,*)
96       IF(lwp) WRITE(numout,*) 'dom_rea : read NetCDF mesh and mask information file(s)'
97       IF(lwp) WRITE(numout,*) '~~~~~~~'
98
99
100      zprt(:,:) = 0.
101
102      SELECT CASE (nmsh)
103         !                                     ! ============================
104         CASE ( 1 )                            !  create 'mesh_mask.nc' file
105            !                                  ! ============================
106
107            IF(lwp) WRITE(numout,*) '          one file in "mesh_mask.nc" '
108            CALL iom_open( 'mesh_mask', inum0 )
109
110            inum2 = inum0                                            ! put all the informations
111            inum3 = inum0                                            ! in unit inum0
112            inum4 = inum0
113
114            !                                  ! ============================
115         CASE ( 2 )                            !  create 'mesh.nc' and
116            !                                  !         'mask.nc' files
117            !                                  ! ============================
118
119            IF(lwp) WRITE(numout,*) '          two files in "mesh.nc" and "mask.nc" '
120            CALL iom_open( 'mesh', inum1 )
121            CALL iom_open( 'mask', inum2 )
122
123            inum3 = inum1                                            ! put mesh informations
124            inum4 = inum1                                            ! in unit inum1
125
126            !                                  ! ============================
127         CASE ( 3 )                            !  create 'mesh_hgr.nc'
128            !                                  !         'mesh_zgr.nc' and
129            !                                  !         'mask.nc'     files
130            !                                  ! ============================
131
132            IF(lwp) WRITE(numout,*) '          three files in "mesh_hgr.nc" , "mesh_zgr.nc" and "mask.nc" '
133            CALL iom_open( 'mesh_hgr', inum3 ) ! create 'mesh_hgr.nc'
134            CALL iom_open( 'mesh_zgr', inum4 ) ! create 'mesh_zgr.nc'
135            CALL iom_open( 'mask'    , inum2 ) ! create 'mask.nc'
136
137         END SELECT
138
139         !                                                         ! masks (inum2)
140         CALL iom_get( inum2, jpdom_data, 'tmask', tmask )
141         CALL iom_get( inum2, jpdom_data, 'umask', umask )
142         CALL iom_get( inum2, jpdom_data, 'vmask', vmask )
143         CALL iom_get( inum2, jpdom_data, 'fmask', fmask )
144
145#if defined key_c1d
146         ! set umask and vmask equal tmask in 1D configuration
147         IF(lwp) WRITE(numout,*)
148         IF(lwp) WRITE(numout,*) '**********  1D configuration : set umask and vmask equal tmask ********'
149         IF(lwp) WRITE(numout,*) '**********                                                     ********'
150
151         umask(:,:,:) = tmask(:,:,:)
152         vmask(:,:,:) = tmask(:,:,:)
153#endif
154
155#if defined key_degrad
156         CALL iom_get( inum2, jpdom_data, 'facvolt', facvol )
157#endif
158
159         !                                                         ! horizontal mesh (inum3)
160         CALL iom_get( inum3, jpdom_data, 'glamt', glamt )
161         CALL iom_get( inum3, jpdom_data, 'glamu', glamu )
162         CALL iom_get( inum3, jpdom_data, 'glamv', glamv )
163         CALL iom_get( inum3, jpdom_data, 'glamf', glamf )
164
165         CALL iom_get( inum3, jpdom_data, 'gphit', gphit )
166         CALL iom_get( inum3, jpdom_data, 'gphiu', gphiu )
167         CALL iom_get( inum3, jpdom_data, 'gphiv', gphiv )
168         CALL iom_get( inum3, jpdom_data, 'gphif', gphif )
169
170         CALL iom_get( inum3, jpdom_data, 'e1t', e1t )
171         CALL iom_get( inum3, jpdom_data, 'e1u', e1u )
172         CALL iom_get( inum3, jpdom_data, 'e1v', e1v )
173         
174         CALL iom_get( inum3, jpdom_data, 'e2t', e2t )
175         CALL iom_get( inum3, jpdom_data, 'e2u', e2u )
176         CALL iom_get( inum3, jpdom_data, 'e2v', e2v )
177
178         CALL iom_get( inum3, jpdom_data, 'ff', ff )
179
180         CALL iom_get( inum4, jpdom_data, 'mbathy', zprt )
181     
182         DO jj = 1, jpj
183            DO ji = 1, jpi
184               mbathy(ji,jj) = MAX( zprt(ji,jj) * tmask(ji,jj,1), 1. ) + 1
185            ENDDO
186         ENDDO
187
188#if ! defined key_zco
189
190         IF( ln_sco ) THEN                                         ! s-coordinate
191            CALL iom_get( inum4, jpdom_data, 'hbatt', hbatt )
192            CALL iom_get( inum4, jpdom_data, 'hbatu', hbatu )
193            CALL iom_get( inum4, jpdom_data, 'hbatv', hbatv )
194            CALL iom_get( inum4, jpdom_data, 'hbatf', hbatf )
195           
196            CALL iom_get( inum4, jpdom_unknown, 'gsigt', gsigt ) ! scaling coef.
197            CALL iom_get( inum4, jpdom_unknown, 'gsigw', gsigw )
198            CALL iom_get( inum4, jpdom_unknown, 'gsi3w', gsi3w ) 
199            CALL iom_get( inum4, jpdom_unknown, 'esigt', esigt )
200            CALL iom_get( inum4, jpdom_unknown, 'esigw', esigw )
201
202            CALL iom_get( inum4, jpdom_data, 'e3t', e3t ) ! scale factors
203            CALL iom_get( inum4, jpdom_data, 'e3u', e3u )
204            CALL iom_get( inum4, jpdom_data, 'e3v', e3v )
205            CALL iom_get( inum4, jpdom_data, 'e3w', e3w )
206
207            CALL iom_get( inum4, jpdom_unknown, 'gdept_0', gdept_0 ) ! depth
208            CALL iom_get( inum4, jpdom_unknown, 'gdepw_0', gdepw_0 )
209         ENDIF
210
211 
212         IF( ln_zps ) THEN   
213            ! Vertical coordinates and scales factors
214            CALL iom_get( inum4, jpdom_unknown, 'gdept_0', gdept_0 ) ! depth
215            CALL iom_get( inum4, jpdom_unknown, 'gdepw_0', gdepw_0 )
216            CALL iom_get( inum4, jpdom_unknown, 'e3t_0'  , e3t_0   )
217            CALL iom_get( inum4, jpdom_unknown, 'e3w_0'  , e3w_0   )
218                                      ! z-coordinate - partial steps
219            IF( nmsh <= 6 ) THEN                                   !    ! 3D vertical scale factors
220              CALL iom_get( inum4, jpdom_data, 'e3t', e3t ) ! scale factors
221              CALL iom_get( inum4, jpdom_data, 'e3u', e3u )
222              CALL iom_get( inum4, jpdom_data, 'e3v', e3v )
223              CALL iom_get( inum4, jpdom_data, 'e3w', e3w )
224            ELSE                                                   !    ! 2D bottom scale factors
225              CALL iom_get( inum4, jpdom_data, 'e3t_ps', e3tp )
226              CALL iom_get( inum4, jpdom_data, 'e3w_ps', e3wp )
227            END IF
228
229            IF( iom_varid( inum4, 'gdept', ldstop = .FALSE. ) > 0 ) THEN
230              CALL iom_get( inum4, jpdom_data, 'gdept', gdept ) ! scale factors
231              CALL iom_get( inum4, jpdom_data, 'gdepw', gdepw )
232            ELSE                                                   !    ! 2D bottom depth
233              CALL iom_get( inum4, jpdom_data, 'hdept', hdept )   ! depth
234              CALL iom_get( inum4, jpdom_data, 'hdepw', hdepw )
235         
236              DO jk = 1,jpk
237                gdept(:,:,jk) = gdept_0(jk)
238                gdepw(:,:,jk) = gdepw_0(jk)
239              ENDDO
240
241              DO jj = 1, jpj
242                DO ji = 1, jpi
243                  ik = mbathy(ji,jj) - 1
244                  ! ocean point only
245                  IF( ik > 0 ) THEN
246                     ! max ocean level case
247                     gdepw(ji,jj,ik+1) = hdepw(ji,jj)
248                     gdept(ji,jj,ik  ) = hdept(ji,jj)
249                     gdept(ji,jj,ik+1) = gdept(ji,jj,ik) + e3t(ji,jj,ik)
250                  ENDIF
251                END DO
252              END DO
253
254            ENDIF
255
256         ENDIF
257# endif
258         IF( ln_zco ) THEN
259           ! Vertical coordinates and scales factors
260           CALL iom_get( inum4, jpdom_unknown, 'gdept_0', gdept_0 ) ! depth
261           CALL iom_get( inum4, jpdom_unknown, 'gdepw_0', gdepw_0 )
262           CALL iom_get( inum4, jpdom_unknown, 'e3t_0'  , e3t_0   )
263           CALL iom_get( inum4, jpdom_unknown, 'e3w_0'  , e3w_0   )
264         ENDIF
265
266
267      ! Control printing : Grid informations (if not restart)
268      ! ----------------
269
270      IF(lwp .AND. .NOT.ln_rstart ) THEN
271         WRITE(numout,*)
272         WRITE(numout,*) '          longitude and e1 scale factors'
273         WRITE(numout,*) '          ------------------------------'
274         WRITE(numout,9300) ( ji, glamt(ji,1), glamu(ji,1),   &
275            glamv(ji,1), glamf(ji,1),   &
276            e1t(ji,1), e1u(ji,1),   &
277            e1v(ji,1), ji = 1, jpi,10)
2789300     FORMAT( 1x, i4, f8.2,1x, f8.2,1x, f8.2,1x, f8.2, 1x,    &
279            f19.10, 1x, f19.10, 1x, f19.10 )
280
281         WRITE(numout,*)
282         WRITE(numout,*) '          latitude and e2 scale factors'
283         WRITE(numout,*) '          -----------------------------'
284         WRITE(numout,9300) ( jj, gphit(1,jj), gphiu(1,jj),   &
285            &                     gphiv(1,jj), gphif(1,jj),   &
286            &                     e2t  (1,jj), e2u  (1,jj),   &
287            &                     e2v  (1,jj), jj = 1, jpj, 10 )
288      ENDIF
289
290
291      IF( nprint == 1 .AND. lwp ) THEN
292         WRITE(numout,*) '          e1u e2u '
293         CALL prihre( e1u,jpi,jpj,jpi-5,jpi,1,jpj-5,jpj,1,0.,numout )
294         CALL prihre( e2u,jpi,jpj,jpi-5,jpi,1,jpj-5,jpj,1,0.,numout )
295         WRITE(numout,*) '          e1v e2v  '
296         CALL prihre( e1v,jpi,jpj,jpi-5,jpi,1,jpj-5,jpj,1,0.,numout )
297         CALL prihre( e2v,jpi,jpj,jpi-5,jpi,1,jpj-5,jpj,1,0.,numout )
298      ENDIF
299
300      IF(lwp) THEN
301         WRITE(numout,*)
302         WRITE(numout,*) '              Reference z-coordinate depth and scale factors:'
303         WRITE(numout, "(9x,' level   gdept    gdepw     e3t      e3w  ')" )
304         WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, gdept_0(jk), gdepw_0(jk), e3t_0(jk), e3w_0(jk), jk = 1, jpk )
305      ENDIF
306
307      DO jk = 1, jpk
308         IF( e3w_0(jk) <= 0. .OR. e3t_0(jk) <= 0. ) CALL ctl_stop ( ' e3w_0 or e3t_0 =< 0 ' )
309         IF( gdepw_0(jk) < 0. .OR. gdept_0(jk) < 0.) CALL ctl_stop( ' gdepw_0 or gdept_0 < 0 ' )
310      END DO
311
312         !                                     ! ============================
313         !                                     !        close the files
314         !                                     ! ============================
315         SELECT CASE ( nmsh )
316            CASE ( 1 )               
317               CALL iom_close( inum0 )
318            CASE ( 2 )
319               CALL iom_close( inum1 )
320               CALL iom_close( inum2 )
321            CASE ( 3 )
322               CALL iom_close( inum2 )
323               CALL iom_close( inum3 )
324               CALL iom_close( inum4 )
325         END SELECT
326
327   END SUBROUTINE dom_rea
328
329#endif
330
331   !!======================================================================
332END MODULE domrea
Note: See TracBrowser for help on using the repository browser.