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.
closea.F90 on Ticket #936 – Attachment – NEMO

Ticket #936: closea.F90

File closea.F90, 25.0 KB (added by beppe, 12 years ago)

Fixed closea.F90

Line 
1MODULE closea
2   !!======================================================================
3   !!                       ***  MODULE  closea  ***
4   !! Closed Seas  : specific treatments associated with closed seas
5   !!======================================================================
6   !! History :   8.2  !  00-05  (O. Marti)  Original code
7   !!             8.5  !  02-06  (E. Durand, G. Madec)  F90
8   !!             9.0  !  06-07  (G. Madec)  add clo_rnf, clo_ups, clo_bat
9   !!        NEMO 3.4  !  03-12  (P.G. Fogli) sbc_clo bug fix & mpp reproducibility
10   !!----------------------------------------------------------------------
11
12   !!----------------------------------------------------------------------
13   !!   dom_clo    : modification of the ocean domain for closed seas cases
14   !!   sbc_clo    : Special handling of closed seas
15   !!   clo_rnf    : set close sea outflows as river mouths (see sbcrnf)
16   !!   clo_ups    : set mixed centered/upstream scheme in closed sea (see traadv_cen2)
17   !!   clo_bat    : set to zero a field over closed sea (see domzrg)
18   !!----------------------------------------------------------------------
19   USE oce             ! dynamics and tracers
20   USE dom_oce         ! ocean space and time domain
21   USE in_out_manager  ! I/O manager
22   USE sbc_oce         ! ocean surface boundary conditions
23   USE lbclnk          ! ???
24   USE lib_fortran,    ONLY: glob_sum
25   USE lib_mpp
26   USE timing
27#ifdef key_mpp_rep
28   USE lib_fortran,    ONLY: DDPDD
29#endif
30
31   IMPLICIT NONE
32   PRIVATE
33
34   PUBLIC dom_clo      ! routine called by domain module
35   PUBLIC sbc_clo      ! routine called by step module
36   PUBLIC clo_rnf      ! routine called by sbcrnf module
37   PUBLIC clo_ups      ! routine called in traadv_cen2(_jki) module
38   PUBLIC clo_bat      ! routine called in domzgr module
39
40   INTEGER, PUBLIC, PARAMETER          ::   jpncs   = 4      !: number of closed sea
41   INTEGER, PUBLIC, DIMENSION(jpncs)   ::   ncstt            !: Type of closed sea
42   INTEGER, PUBLIC, DIMENSION(jpncs)   ::   ncsi1, ncsj1     !: south-west closed sea limits (i,j)
43   INTEGER, PUBLIC, DIMENSION(jpncs)   ::   ncsi2, ncsj2     !: north-east closed sea limits (i,j)
44   INTEGER, PUBLIC, DIMENSION(jpncs)   ::   ncsnr            !: number of point where run-off pours
45   INTEGER, PUBLIC, DIMENSION(jpncs,4) ::   ncsir, ncsjr     !: Location of runoff
46
47   REAL(wp), DIMENSION (jpncs+1)       ::   surf             ! closed sea surface
48
49   !! * Substitutions
50#  include "vectopt_loop_substitute.h90"
51   !!----------------------------------------------------------------------
52   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
53   !! $Id$
54   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
55   !!----------------------------------------------------------------------
56CONTAINS
57
58   SUBROUTINE dom_clo
59      !!---------------------------------------------------------------------
60      !!                  ***  ROUTINE dom_clo  ***
61      !!       
62      !! ** Purpose :   Closed sea domain initialization
63      !!
64      !! ** Method  :   if a closed sea is located only in a model grid point
65      !!                just the thermodynamic processes are applied.
66      !!
67      !! ** Action  :   ncsi1(), ncsj1() : south-west closed sea limits (i,j)
68      !!                ncsi2(), ncsj2() : north-east Closed sea limits (i,j)
69      !!                ncsir(), ncsjr() : Location of runoff
70      !!                ncsnr            : number of point where run-off pours
71      !!                ncstt            : Type of closed sea
72      !!                                   =0 spread over the world ocean
73      !!                                   =2 put at location runoff
74      !!----------------------------------------------------------------------
75      INTEGER ::   jc            ! dummy loop indices
76      !!----------------------------------------------------------------------
77     
78      IF(lwp) WRITE(numout,*)
79      IF(lwp) WRITE(numout,*)'dom_clo : closed seas '
80      IF(lwp) WRITE(numout,*)'~~~~~~~'
81
82      ! initial values
83      ncsnr(:) = 1  ;  ncsi1(:) = 1  ;  ncsi2(:) = 1  ;  ncsir(:,:) = 1
84      ncstt(:) = 0  ;  ncsj1(:) = 1  ;  ncsj2(:) = 1  ;  ncsjr(:,:) = 1
85
86      ! set the closed seas (in data domain indices)
87      ! -------------------
88
89      IF( cp_cfg == "orca" ) THEN
90         !
91         SELECT CASE ( jp_cfg )
92         !                                           ! =======================
93         CASE ( 2 )                                  !  ORCA_R2 configuration
94            !                                        ! =======================
95            !                                            ! Caspian Sea
96            ncsnr(1)   =   1  ;  ncstt(1)   =   0           ! spread over the globe
97            ncsi1(1)   =  11  ;  ncsj1(1)   = 103
98            ncsi2(1)   =  17  ;  ncsj2(1)   = 112
99            ncsir(1,1) =   1  ;  ncsjr(1,1) =   1 
100            !                                            ! Great North American Lakes
101            ncsnr(2)   =   1  ;  ncstt(2)   =   2           ! put at St Laurent mouth
102            ncsi1(2)   =  97  ;  ncsj1(2)   = 107
103            ncsi2(2)   = 103  ;  ncsj2(2)   = 111
104            ncsir(2,1) = 110  ;  ncsjr(2,1) = 111
105            !                                            ! Black Sea 1 : west part of the Black Sea
106            ncsnr(3)   = 1    ; ncstt(3)   =   2            !            (ie west of the cyclic b.c.)
107            ncsi1(3)   = 174  ; ncsj1(3)   = 107            ! put in Med Sea
108            ncsi2(3)   = 181  ; ncsj2(3)   = 112
109            ncsir(3,1) = 171  ; ncsjr(3,1) = 106 
110            !                                            ! Black Sea 2 : est part of the Black Sea
111            ncsnr(4)   =   1  ;  ncstt(4)   =   2           !               (ie est of the cyclic b.c.)
112            ncsi1(4)   =   2  ;  ncsj1(4)   = 107           ! put in Med Sea
113            ncsi2(4)   =   6  ;  ncsj2(4)   = 112
114            ncsir(4,1) = 171  ;  ncsjr(4,1) = 106 
115            !                                        ! =======================
116         CASE ( 4 )                                  !  ORCA_R4 configuration
117            !                                        ! =======================
118            !                                            ! Caspian Sea
119            ncsnr(1)   =  1  ;  ncstt(1)   =  0 
120            ncsi1(1)   =  4  ;  ncsj1(1)   = 53 
121            ncsi2(1)   =  4  ;  ncsj2(1)   = 56
122            ncsir(1,1) =  1  ;  ncsjr(1,1) =  1
123            !                                            ! Great North American Lakes
124            ncsnr(2)   =  1  ;  ncstt(2)   =  2 
125            ncsi1(2)   = 49  ;  ncsj1(2)   = 55
126            ncsi2(2)   = 51  ;  ncsj2(2)   = 56
127            ncsir(2,1) = 57  ;  ncsjr(2,1) = 55
128            !                                            ! Black Sea
129            ncsnr(3)   =  4  ;  ncstt(3)   =  2 
130            ncsi1(3)   = 88  ;  ncsj1(3)   = 55 
131            ncsi2(3)   = 91  ;  ncsj2(3)   = 56
132            ncsir(3,1) = 86  ;  ncsjr(3,1) = 53
133            ncsir(3,2) = 87  ;  ncsjr(3,2) = 53 
134            ncsir(3,3) = 86  ;  ncsjr(3,3) = 52 
135            ncsir(3,4) = 87  ;  ncsjr(3,4) = 52
136            !                                            ! Baltic Sea
137            ncsnr(4)   =  1  ;  ncstt(4)   =  2
138            ncsi1(4)   = 75  ;  ncsj1(4)   = 59
139            ncsi2(4)   = 76  ;  ncsj2(4)   = 61
140            ncsir(4,1) = 84  ;  ncsjr(4,1) = 59 
141            !                                        ! =======================
142         CASE ( 025 )                                ! ORCA_R025 configuration
143            !                                        ! =======================
144            ncsnr(1)   = 1    ; ncstt(1)   = 0               ! Caspian + Aral sea
145            ncsi1(1)   = 1330 ; ncsj1(1)   = 645
146            ncsi2(1)   = 1400 ; ncsj2(1)   = 795
147            ncsir(1,1) = 1    ; ncsjr(1,1) = 1
148            !                                       
149            ncsnr(2)   = 1    ; ncstt(2)   = 0               ! Azov Sea
150            ncsi1(2)   = 1284 ; ncsj1(2)   = 722
151            ncsi2(2)   = 1304 ; ncsj2(2)   = 747
152            ncsir(2,1) = 1    ; ncsjr(2,1) = 1
153            !
154         END SELECT
155         !
156      ENDIF
157
158      ! convert the position in local domain indices
159      ! --------------------------------------------
160      DO jc = 1, jpncs
161         ncsi1(jc)   = mi0( ncsi1(jc) )
162         ncsj1(jc)   = mj0( ncsj1(jc) )
163
164         ncsi2(jc)   = mi1( ncsi2(jc) )   
165         ncsj2(jc)   = mj1( ncsj2(jc) ) 
166      END DO
167      !
168   END SUBROUTINE dom_clo
169
170#if ! defined key_mpp_rep
171
172   SUBROUTINE sbc_clo( kt )
173      !!---------------------------------------------------------------------
174      !!                  ***  ROUTINE sbc_clo  ***
175      !!                   
176      !! ** Purpose :   Special handling of closed seas
177      !!
178      !! ** Method  :   Water flux is forced to zero over closed sea
179      !!      Excess is shared between remaining ocean, or
180      !!      put as run-off in open ocean.
181      !!
182      !! ** Action  :   emp, emps   updated surface freshwater fluxes at kt
183      !!----------------------------------------------------------------------
184      INTEGER, INTENT(in) ::   kt   ! ocean model time step
185      !
186      INTEGER                     ::   ji, jj, jc, jn   ! dummy loop indices
187      REAL(wp)                    ::   zze2
188      REAL(wp), DIMENSION (jpncs) ::   zfwf 
189      REAL(wp) ::                      zcorr       ! Closed sea correction
190      REAL(wp), PARAMETER :: rsmall = 1.0e-20_wp   ! Closed sea correction epsilon
191      !!----------------------------------------------------------------------
192      !
193      IF( nn_timing == 1 )  CALL timing_start('sbc_clo')
194      !                                                   !------------------!
195      IF( kt == nit000 ) THEN                             !  Initialisation  !
196         !                                                !------------------!
197         IF(lwp) WRITE(numout,*)
198         IF(lwp) WRITE(numout,*)'sbc_clo : closed seas '
199         IF(lwp) WRITE(numout,*)'~~~~~~~'
200
201         surf(:) = 0.e0_wp
202
203         ! Total surface of ocean
204         surf(jpncs+1) = glob_sum( e1e2t(:,:) )
205
206         DO jc = 1, jpncs
207            DO jj = ncsj1(jc), ncsj2(jc)
208               DO ji = ncsi1(jc), ncsi2(jc)
209                  surf(jc) = surf(jc) + e1e2t(ji,jj) * tmask_i(ji,jj)      ! surface of closed seas
210               END DO
211            END DO
212         END DO
213         IF( lk_mpp )   CALL mpp_sum ( surf, jpncs+1 )       ! mpp: sum over all the global domain
214
215         IF(lwp) WRITE(numout,*)'     Closed sea surfaces'
216         DO jc = 1, jpncs
217            IF(lwp)WRITE(numout,FMT='(1I3,4I4,5X,F16.2)') jc, ncsi1(jc), ncsi2(jc), ncsj1(jc), ncsj2(jc), surf(jc)
218         END DO
219
220         ! jpncs+1 : surface of sea, closed seas excluded
221         DO jc = 1, jpncs
222            surf(jpncs+1) = surf(jpncs+1) - surf(jc)
223         END DO           
224         !
225      ENDIF
226      !                                                   !--------------------!
227      !                                                   !  update emp, emps  !
228      zfwf = 0.e0_wp                                      !--------------------!
229      DO jc = 1, jpncs
230         DO jj = ncsj1(jc), ncsj2(jc)
231            DO ji = ncsi1(jc), ncsi2(jc)
232               zfwf(jc) = zfwf(jc) + e1e2t(ji,jj) * ( emp(ji,jj)-rnf(ji,jj) ) * tmask_i(ji,jj) 
233            END DO 
234         END DO
235      END DO
236      IF( lk_mpp )   CALL mpp_sum ( zfwf(:) , jpncs )       ! mpp: sum over all the global domain
237
238      IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN      ! Black Sea case for ORCA_R2 configuration
239         zze2    = ( zfwf(3) + zfwf(4) ) * 0.5_wp
240         zfwf(3) = zze2
241         zfwf(4) = zze2
242      ENDIF
243
244      zcorr = 0.0_wp
245
246      DO jc = 1, jpncs
247         !
248         ! The following if avoids the redistribution of the round off
249         IF (ABS(zfwf(jc)/surf(jpncs+1)) > rsmall) THEN
250            IF( ncstt(jc) == 0 ) THEN 
251               ! water/evap excess is shared by all open ocean
252               emp (:,:) = emp (:,:) + zfwf(jc) / surf(jpncs+1)
253               emps(:,:) = emps(:,:) + zfwf(jc) / surf(jpncs+1)
254               ! accumulate closed seas correction
255               zcorr     = zcorr     + zfwf(jc) / surf(jpncs+1)
256            ELSEIF( ncstt(jc) == 1 ) THEN 
257               ! Excess water in open sea, at outflow location, excess evap shared
258               IF ( zfwf(jc) <= 0.e0_wp ) THEN
259                   DO jn = 1, ncsnr(jc)
260                     ji = mi0(ncsir(jc,jn))
261                     jj = mj0(ncsjr(jc,jn)) ! Location of outflow in open ocean
262                     IF (      ji > 1 .AND. ji < jpi   &
263                         .AND. jj > 1 .AND. jj < jpj ) THEN
264                         emp (ji,jj) = emp (ji,jj) + zfwf(jc) /   &
265                            (FLOAT(ncsnr(jc)) * e1t(ji,jj) * e2t(ji,jj))
266                         emps(ji,jj) = emps(ji,jj) + zfwf(jc) /   &
267                             (FLOAT(ncsnr(jc)) * e1t(ji,jj) * e2t(ji,jj))
268                     END IF
269                  END DO
270               ELSE
271                   emp (:,:) = emp (:,:) + zfwf(jc) / surf(jpncs+1)
272                   emps(:,:) = emps(:,:) + zfwf(jc) / surf(jpncs+1)
273                   ! acuumulate closed seas correction
274                   zcorr     = zcorr     + zfwf(jc) / surf(jpncs+1)
275               ENDIF
276            ELSEIF( ncstt(jc) == 2 ) THEN 
277               ! Excess e-p+r (either sign) goes to open ocean, at outflow location
278               DO jn = 1, ncsnr(jc)
279                  ji = mi0(ncsir(jc,jn))
280                  jj = mj0(ncsjr(jc,jn)) ! Location of outflow in open ocean
281                  IF(      ji > 1 .AND. ji < jpi    &
282                     .AND. jj > 1 .AND. jj < jpj ) THEN
283                     emp (ji,jj) = emp (ji,jj) + zfwf(jc)   &
284                      / (FLOAT(ncsnr(jc)) *  e1t(ji,jj) * e2t(ji,jj) )
285                     emps(ji,jj) = emps(ji,jj) + zfwf(jc)   &
286                      / (FLOAT(ncsnr(jc)) *  e1t(ji,jj) * e2t(ji,jj) )
287                  ENDIF
288               END DO
289            ENDIF 
290            !
291            DO jj = ncsj1(jc), ncsj2(jc)
292               DO ji = ncsi1(jc), ncsi2(jc)
293                  emp (ji,jj) = emp (ji,jj) - zfwf(jc) / surf(jc)
294                  emps(ji,jj) = emps(ji,jj) - zfwf(jc) / surf(jc)
295               END DO 
296            END DO 
297            !
298         END IF
299      END DO 
300
301      ! remove the accumulated global correction from the closed seas
302      IF (ABS(zcorr) > rsmall ) THEN
303        DO jc = 1, jpncs
304          DO jj = ncsj1(jc), ncsj2(jc)
305            DO ji = ncsi1(jc), ncsi2(jc)
306               emp (ji,jj) = emp (ji,jj) - zcorr
307               emps(ji,jj) = emps(ji,jj) - zcorr
308            END DO 
309          END DO
310        END DO
311      END IF
312
313      !
314      emp(:,:)  = emp(:,:) * tmask(:,:,1)
315      emps(:,:) = emps(:,:) * tmask(:,:,1)
316      !
317      CALL lbc_lnk( emp , 'T', 1._wp )
318      CALL lbc_lnk( emps, 'T', 1._wp )
319      !
320      IF( nn_timing == 1 )  CALL timing_stop('sbc_clo')
321      !
322   END SUBROUTINE sbc_clo
323
324#else
325
326   SUBROUTINE sbc_clo( kt )
327      !!---------------------------------------------------------------------
328      !!                  ***  ROUTINE sbc_clo  ***
329      !!                   
330      !! ** Purpose :   Special handling of closed seas (key_mpp_rep version)
331      !!
332      !! ** Method  :   Water flux is forced to zero over closed sea
333      !!      Excess is shared between remaining ocean, or
334      !!      put as run-off in open ocean.
335      !!
336      !! ** Action  :   emp, emps   updated surface freshwater fluxes at kt
337      !!----------------------------------------------------------------------
338      INTEGER, INTENT(in) ::   kt   ! ocean model time step
339      !
340      INTEGER                     :: ji, jj, jc, jn   ! dummy loop indices
341      REAL(wp)                    :: zze2
342      REAL(wp), DIMENSION (jpncs) :: zfwf 
343      REAL(wp) ::                      zcorr       ! Closed sea correction
344      REAL(wp), PARAMETER :: rsmall = 1.D-20_wp    ! Closed sea correction epsilon
345      REAL(wp)                    :: ztmp
346      COMPLEX(wp)                 :: ctmp 
347      !!----------------------------------------------------------------------
348      !
349      IF( nn_timing == 1 )  CALL timing_start('sbc_clo')
350      !                                                   !------------------!
351      IF( kt == nit000 ) THEN                             !  Initialisation  !
352         !                                                !------------------!
353         IF(lwp) WRITE(numout,*)
354         IF(lwp) WRITE(numout,*)'sbc_clo : closed seas '
355         IF(lwp) WRITE(numout,*)'~~~~~~~'
356
357         surf(:) = 0.e0_wp
358
359         ! Total surface of ocean
360         surf(jpncs+1) = glob_sum( e1e2t(:,:) )
361
362         DO jc = 1, jpncs
363            ctmp = CMPLX( 0.e0, 0.e0, wp )
364            DO jj = ncsj1(jc), ncsj2(jc)
365               DO ji = ncsi1(jc), ncsi2(jc)
366                  ztmp = e1e2t(ji,jj) * tmask_i(ji,jj)
367                  CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp )
368               END DO
369            END DO
370            IF( lk_mpp )   CALL mpp_sum( ctmp )
371            surf(jc) = REAL(ctmp,wp)
372         END DO
373
374         IF(lwp) WRITE(numout,*)'     Closed sea surfaces'
375         DO jc = 1, jpncs
376            IF(lwp)WRITE(numout,FMT='(1I3,4I4,5X,F16.2)') jc, ncsi1(jc), ncsi2(jc), ncsj1(jc), ncsj2(jc), surf(jc)
377         END DO
378
379         ! jpncs+1 : surface of sea, closed seas excluded
380         DO jc = 1, jpncs
381            surf(jpncs+1) = surf(jpncs+1) - surf(jc)
382         END DO           
383         !
384      ENDIF
385      !                                                   !--------------------!
386      !                                                   !  update emp, emps  !
387      zfwf = 0.e0_wp                                      !--------------------!
388      DO jc = 1, jpncs
389         ctmp = CMPLX( 0.e0, 0.e0, wp )
390         DO jj = ncsj1(jc), ncsj2(jc)
391            DO ji = ncsi1(jc), ncsi2(jc)
392               ztmp = e1e2t(ji,jj) * ( emp(ji,jj)-rnf(ji,jj) ) * tmask_i(ji,jj)
393               CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp )
394            END DO 
395         END DO
396         IF( lk_mpp )   CALL mpp_sum( ctmp )
397         zfwf(jc) = REAL(ctmp,wp)
398      END DO
399
400      IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN      ! Black Sea case for ORCA_R2 configuration
401         zze2    = ( zfwf(3) + zfwf(4) ) * 0.5_wp
402         zfwf(3) = zze2
403         zfwf(4) = zze2
404      ENDIF
405
406      zcorr = 0.0_wp
407
408      DO jc = 1, jpncs
409         !
410         ! The following if avoids the redistribution of the round off
411         IF (ABS(zfwf(jc)/surf(jpncs+1)) > rsmall) THEN
412            IF( ncstt(jc) == 0 ) THEN 
413               ! water/evap excess is shared by all open ocean
414               emp (:,:) = emp (:,:) + zfwf(jc) / surf(jpncs+1)
415               emps(:,:) = emps(:,:) + zfwf(jc) / surf(jpncs+1)
416               ! accumulate closed seas correction
417               zcorr     = zcorr     + zfwf(jc) / surf(jpncs+1)
418            ELSEIF( ncstt(jc) == 1 ) THEN 
419               ! Excess water in open sea, at outflow location, excess evap shared
420               IF ( zfwf(jc) <= 0.e0_wp ) THEN
421                   DO jn = 1, ncsnr(jc)
422                     ji = mi0(ncsir(jc,jn))
423                     jj = mj0(ncsjr(jc,jn)) ! Location of outflow in open ocean
424                     IF (      ji > 1 .AND. ji < jpi   &
425                         .AND. jj > 1 .AND. jj < jpj ) THEN
426                         emp (ji,jj) = emp (ji,jj) + zfwf(jc) /   &
427                            (FLOAT(ncsnr(jc)) * e1t(ji,jj) * e2t(ji,jj))
428                         emps(ji,jj) = emps(ji,jj) + zfwf(jc) /   &
429                             (FLOAT(ncsnr(jc)) * e1t(ji,jj) * e2t(ji,jj))
430                     END IF
431                   END DO
432               ELSE
433                   emp (:,:) = emp (:,:) + zfwf(jc) / surf(jpncs+1)
434                   emps(:,:) = emps(:,:) + zfwf(jc) / surf(jpncs+1)
435                   ! accumulate closed seas correction
436                   zcorr     = zcorr     + zfwf(jc) / surf(jpncs+1)
437               ENDIF
438            ELSEIF( ncstt(jc) == 2 ) THEN 
439               ! Excess e-p+r (either sign) goes to open ocean, at outflow location
440               DO jn = 1, ncsnr(jc)
441                  ji = mi0(ncsir(jc,jn))
442                  jj = mj0(ncsjr(jc,jn)) ! Location of outflow in open ocean
443                  IF(      ji > 1 .AND. ji < jpi    &
444                  .AND. jj > 1 .AND. jj < jpj ) THEN
445                     emp (ji,jj) = emp (ji,jj) + zfwf(jc)   &
446                         / (FLOAT(ncsnr(jc)) *  e1t(ji,jj) * e2t(ji,jj) )
447                     emps(ji,jj) = emps(ji,jj) + zfwf(jc)   &
448                         / (FLOAT(ncsnr(jc)) *  e1t(ji,jj) * e2t(ji,jj) )
449                  ENDIF
450               END DO
451            ENDIF 
452            !
453            DO jj = ncsj1(jc), ncsj2(jc)
454               DO ji = ncsi1(jc), ncsi2(jc)
455                  emp (ji,jj) = emp (ji,jj) - zfwf(jc) / surf(jc)
456                  emps(ji,jj) = emps(ji,jj) - zfwf(jc) / surf(jc)
457               END DO 
458            END DO 
459            !
460         END IF
461      END DO 
462
463      ! Bug fix: remove the global correction from the closed seas
464      IF (ABS(zcorr) > rsmall ) THEN
465        DO jc = 1, jpncs
466          DO jj = ncsj1(jc), ncsj2(jc)
467            DO ji = ncsi1(jc), ncsi2(jc)
468               emp (ji,jj) = emp (ji,jj) - zcorr
469               emps(ji,jj) = emps(ji,jj) - zcorr
470            END DO 
471          END DO
472        END DO
473      END IF
474
475      !
476      emp(:,:)  = emp(:,:) * tmask(:,:,1)
477      emps(:,:) = emps(:,:) * tmask(:,:,1)
478      !
479      CALL lbc_lnk( emp , 'T', 1._wp )
480      CALL lbc_lnk( emps, 'T', 1._wp )
481      !
482      IF( nn_timing == 1 )  CALL timing_stop('sbc_clo')
483      !
484   END SUBROUTINE sbc_clo
485
486#endif
487   
488   
489   SUBROUTINE clo_rnf( p_rnfmsk )
490      !!---------------------------------------------------------------------
491      !!                  ***  ROUTINE sbc_rnf  ***
492      !!                   
493      !! ** Purpose :   allow the treatment of closed sea outflow grid-points
494      !!                to be the same as river mouth grid-points
495      !!
496      !! ** Method  :   set to 1 the runoff mask (mskrnf, see sbcrnf module)
497      !!                at the closed sea outflow grid-point.
498      !!
499      !! ** Action  :   update (p_)mskrnf (set 1 at closed sea outflow)
500      !!----------------------------------------------------------------------
501      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   p_rnfmsk   ! river runoff mask (rnfmsk array)
502      !
503      INTEGER  ::   jc, jn      ! dummy loop indices
504      INTEGER  ::   ii, ij      ! temporary integer
505      !!----------------------------------------------------------------------
506      !
507      DO jc = 1, jpncs
508         IF( ncstt(jc) >= 1 ) THEN            ! runoff mask set to 1 at closed sea outflows
509             DO jn = 1, 4
510               ii = mi0( ncsir(jc,jn) )
511               ij = mj0( ncsjr(jc,jn) )
512               p_rnfmsk(ii,ij) = MAX( p_rnfmsk(ii,ij), 1.0_wp )
513            END DO
514         ENDIF
515      END DO 
516      !
517   END SUBROUTINE clo_rnf
518
519   
520   SUBROUTINE clo_ups( p_upsmsk )
521      !!---------------------------------------------------------------------
522      !!                  ***  ROUTINE sbc_rnf  ***
523      !!                   
524      !! ** Purpose :   allow the treatment of closed sea outflow grid-points
525      !!                to be the same as river mouth grid-points
526      !!
527      !! ** Method  :   set to 0.5 the upstream mask (upsmsk, see traadv_cen2
528      !!                module) over the closed seas.
529      !!
530      !! ** Action  :   update (p_)upsmsk (set 0.5 over closed seas)
531      !!----------------------------------------------------------------------
532      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   p_upsmsk   ! upstream mask (upsmsk array)
533      !
534      INTEGER  ::   jc, ji, jj      ! dummy loop indices
535      !!----------------------------------------------------------------------
536      !
537      DO jc = 1, jpncs
538         DO jj = ncsj1(jc), ncsj2(jc)
539            DO ji = ncsi1(jc), ncsi2(jc)
540               p_upsmsk(ji,jj) = 0.5_wp         ! mixed upstream/centered scheme over closed seas
541            END DO
542         END DO
543       END DO 
544       !
545   END SUBROUTINE clo_ups
546   
547     
548   SUBROUTINE clo_bat( pbat, kbat )
549      !!---------------------------------------------------------------------
550      !!                  ***  ROUTINE clo_bat  ***
551      !!                   
552      !! ** Purpose :   suppress closed sea from the domain
553      !!
554      !! ** Method  :   set to 0 the meter and level bathymetry (given in
555      !!                arguments) over the closed seas.
556      !!
557      !! ** Action  :   set pbat=0 and kbat=0 over closed seas
558      !!----------------------------------------------------------------------
559      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pbat   ! bathymetry in meters (bathy array)
560      INTEGER , DIMENSION(jpi,jpj), INTENT(inout) ::   kbat   ! bathymetry in levels (mbathy array)
561      !
562      INTEGER  ::   jc, ji, jj      ! dummy loop indices
563      !!----------------------------------------------------------------------
564      !
565      DO jc = 1, jpncs
566         DO jj = ncsj1(jc), ncsj2(jc)
567            DO ji = ncsi1(jc), ncsi2(jc)
568               pbat(ji,jj) = 0._wp   
569               kbat(ji,jj) = 0   
570            END DO
571         END DO
572       END DO 
573       !
574   END SUBROUTINE clo_bat
575
576   !!======================================================================
577END MODULE closea
578