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 in trunk/NEMO/OPA_SRC/DOM – NEMO

source: trunk/NEMO/OPA_SRC/DOM/closea.F90 @ 247

Last change on this file since 247 was 247, checked in by opalod, 19 years ago

CL : Add CVS Header and CeCILL licence information

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.6 KB
Line 
1MODULE closea
2   !!======================================================================
3   !!                       ***  MODULE  closea  ***
4   !! Closed Seas  :
5   !!======================================================================
6
7   !!----------------------------------------------------------------------
8   !!   dom_clo    : modification of the ocean domain for closed seas cases
9   !!   flx_clo    : Special handling of closed seas
10   !!----------------------------------------------------------------------
11   !! * Modules used
12   USE oce             ! dynamics and tracers
13   USE dom_oce         ! ocean space and time domain
14   USE in_out_manager  ! I/O manager
15   USE ocesbc          ! ocean surface boundary conditions (fluxes)
16   USE flxrnf          ! runoffs
17   USE lib_mpp         ! distributed memory computing library
18   USE lbclnk          ! ???
19
20   IMPLICIT NONE
21   PRIVATE
22
23   !! * Accessibility
24   PUBLIC dom_clo      ! routine called by dom_init
25   PUBLIC flx_clo      ! routine called by step
26
27   !! * Share module variables
28   INTEGER, PUBLIC, PARAMETER ::   &  !:
29      jpncs   = 4               !: number of closed sea
30   INTEGER, PUBLIC ::          & !!: namclo : closed seas and lakes
31      nclosea =  0                !: = 0 no closed sea or lake
32      !                           !  = 1 closed sea or lake in the domain
33   INTEGER, PUBLIC, DIMENSION (jpncs) ::   &  !:
34      ncstt,           &  !: Type of closed sea
35      ncsi1, ncsj1,    &  !: closed sea limits                                                                 
36      ncsi2, ncsj2,    &  !:
37      ncsnr               !: number of point where run-off pours
38   INTEGER, PUBLIC, DIMENSION (jpncs,4) ::   &
39      ncsir, ncsjr        !: Location of run-off
40
41   !! * Module variable
42   REAL(wp), DIMENSION (jpncs+1) ::   &
43      surf               ! closed sea surface
44
45   !! * Substitutions
46#  include "vectopt_loop_substitute.h90"
47   !!----------------------------------------------------------------------
48   !!  OPA 9.0 , LOCEAN-IPSL (2005)
49   !! $Header$
50   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
51   !!----------------------------------------------------------------------
52
53CONTAINS
54
55   SUBROUTINE dom_clo
56      !!---------------------------------------------------------------------
57      !!                  ***  ROUTINE dom_clo  ***
58      !!       
59      !! ** Purpose :   Closed sea domain initialization
60      !!
61      !! ** Method  :   if a closed sea is located only in a model grid point
62      !!      just the thermodynamic processes are applied.
63      !!
64      !! ** Action :   ncsi1(), ncsj1() : south-west closed sea limits (i,j)
65      !!               ncsi2(), ncsj2() : north-east Closed sea limits (i,j)
66      !!               ncsir(), ncsjr() : Location of runoff
67      !!               ncsnr            : number of point where run-off pours
68      !!               ncstt            : Type of closed sea
69      !!                                  =0 spread over the world ocean
70      !!                                  =2 put at location runoff
71      !!
72      !! History :
73      !!        !  01-04  (E. Durand)  Original code
74      !!   8.5  !  02-06  (G. Madec)  F90: Free form and module
75      !!----------------------------------------------------------------------
76      !! * Local variables
77      INTEGER ::   jc            ! dummy loop indices
78      !!----------------------------------------------------------------------
79     
80      IF(lwp) WRITE(numout,*)
81      IF(lwp) WRITE(numout,*)'dom_clo : closed seas '
82      IF(lwp) WRITE(numout,*)'~~~~~~~'
83
84      ! initial values
85      ncsnr(:) = 1  ;  ncsi1(:) = 1  ;  ncsi2(:) = 1  ;  ncsir(:,:) = 1
86      ncstt(:) = 0  ;  ncsj1(:) = 1  ;  ncsj2(:) = 1  ;  ncsjr(:,:) = 1
87
88      ! set the closed seas (in data domain indices)
89      ! -------------------
90
91      IF( cp_cfg == "orca" ) THEN
92   
93         SELECT CASE ( jp_cfg )
94         !                                           ! =======================
95         CASE ( 2 )                                  !  ORCA_R2 configuration
96            !                                        ! =======================
97
98            !                                            ! Caspian Sea
99            ncsnr(1)   =   1  ;  ncstt(1)   =   0           ! spread over the globe
100            ncsi1(1)   =  11  ;  ncsj1(1)   = 103
101            ncsi2(1)   =  17  ;  ncsj2(1)   = 112
102            ncsir(1,1) =   1  ;  ncsjr(1,1) =   1 
103            !                                            ! Great North American Lakes
104            ncsnr(2)   =   1  ;  ncstt(2)   =   2           ! put at St Laurent mouth
105            ncsi1(2)   =  97  ;  ncsj1(2)   = 107
106            ncsi2(2)   = 103  ;  ncsj2(2)   = 111
107            ncsir(2,1) = 110  ;  ncsjr(2,1) = 111
108            !                                            ! Black Sea 1 : west part of the Black Sea
109            ncsnr(3)   = 1    ; ncstt(3)   =   2            !            (ie west of the cyclic b.c.)
110            ncsi1(3)   = 174  ; ncsj1(3)   = 107            ! put in Med Sea
111            ncsi2(3)   = 181  ; ncsj2(3)   = 112
112            ncsir(3,1) = 171  ; ncsjr(3,1) = 106 
113            !                                            ! Black Sea 2 : est part of the Black Sea
114            ncsnr(4)   =   1  ;  ncstt(4)   =   2           !               (ie est of the cyclic b.c.)
115            ncsi1(4)   =   2  ;  ncsj1(4)   = 107           ! put in Med Sea
116            ncsi2(4)   =   6  ;  ncsj2(4)   = 112
117            ncsir(4,1) = 171  ;  ncsjr(4,1) = 106 
118
119            !                                        ! =======================
120         CASE ( 4 )                                  !  ORCA_R4 configuration
121            !                                        ! =======================
122
123            !                                            ! Caspian Sea
124            ncsnr(1)   =  1  ;  ncstt(1)   =  0 
125            ncsi1(1)   =  4  ;  ncsj1(1)   = 53 
126            ncsi2(1)   =  4  ;  ncsj2(1)   = 56
127            ncsir(1,1) =  1  ;  ncsjr(1,1) =  1
128            !                                            ! Great North American Lakes
129            ncsnr(2)   =  1  ;  ncstt(2)   =  2 
130            ncsi1(2)   = 49  ;  ncsj1(2)   = 55
131            ncsi2(2)   = 51  ;  ncsj2(2)   = 56
132            ncsir(2,1) = 57  ;  ncsjr(2,1) = 55
133            !                                            ! Black Sea
134            ncsnr(3)   =  4  ;  ncstt(3)   =  2 
135            ncsi1(3)   = 88  ;  ncsj1(3)   = 55 
136            ncsi2(3)   = 91  ;  ncsj2(3)   = 56
137            ncsir(3,1) = 86  ;  ncsjr(3,1) = 53
138            ncsir(3,2) = 87  ;  ncsjr(3,2) = 53 
139            ncsir(3,3) = 86  ;  ncsjr(3,3) = 52 
140            ncsir(3,4) = 87  ;  ncsjr(3,4) = 52
141            !                                            ! Baltic Sea
142            ncsnr(4)   =  1  ;  ncstt(4)   =  2
143            ncsi1(4)   = 75  ;  ncsj1(4)   = 59
144            ncsi2(4)   = 76  ;  ncsj2(4)   = 61
145            ncsir(4,1) = 84  ;  ncsjr(4,1) = 59 
146
147         END SELECT
148
149      ENDIF
150
151      ! convert the position in local domain indices
152      ! --------------------------------------------
153      DO jc = 1, jpncs
154         ncsi1(jc)   = mi0( ncsi1(jc) )
155         ncsj1(jc)   = mj0( ncsj1(jc) )
156
157         ncsi2(jc)   = mi1( ncsi2(jc) )   
158         ncsj2(jc)   = mj1( ncsj2(jc) ) 
159      END DO
160         
161
162   END SUBROUTINE dom_clo
163
164
165   SUBROUTINE flx_clo( kt )
166      !!---------------------------------------------------------------------
167      !!                  ***  ROUTINE flx_clo  ***
168      !!                   
169      !! ** Purpose :   Special handling of closed seas
170      !!
171      !! ** Method  :   Water flux is forced to zero over closed sea
172      !!      Excess is shared between remaining ocean, or
173      !!      put as run-off in open ocean.
174      !!
175      !! ** Action :
176      !!
177      !! History :
178      !!   8.2  !  00-05  (O. Marti)  Original code
179      !!   8.5  !  02-07  (G. Madec)  Free form, F90
180      !!----------------------------------------------------------------------
181      !! * Arguments
182      INTEGER, INTENT (in) :: kt
183
184      !! * Local declarations
185      REAL(wp), DIMENSION (jpncs) :: zemp
186      INTEGER  :: ji, jj, jc, jn
187      REAL(wp) :: zze2
188      !!----------------------------------------------------------------------
189
190      ! 1 - Initialisation
191      ! ------------------
192
193      IF( kt == nit000 ) THEN
194         IF(lwp) WRITE(numout,*)
195         IF(lwp) WRITE(numout,*)'flx_clo : closed seas '
196         IF(lwp) WRITE(numout,*)'~~~~~~~'
197
198         ! Total surface of ocean
199         surf(jpncs+1) = SUM( e1t(:,:) * e2t(:,:) * tmask_i(:,:) )
200
201         DO jc = 1, jpncs
202            surf(jc) =0.e0
203            DO jj = ncsj1(jc), ncsj2(jc)
204               DO ji = ncsi1(jc), ncsi2(jc)
205                  ! surface of closed seas
206                  surf(jc) = surf(jc) + e1t(ji,jj)*e2t(ji,jj)*tmask_i(ji,jj)
207                  ! upstream in closed seas
208                  upsadv(ji,jj) = 0.5
209               END DO
210            END DO 
211            ! upstream at closed sea outflow
212            IF( ncstt(jc) >= 1 ) THEN
213                DO jn = 1, 4
214                  ji = mi0( ncsir(jc,jn) )
215                  jj = mj0( ncsjr(jc,jn) )
216                  upsrnfh(ji,jj) = MAX( upsrnfh(ji,jj), 1.0 )
217                END DO
218            ENDIF
219         END DO
220         IF( lk_mpp )   CALL mpp_sum ( surf, jpncs+1 )       ! mpp: sum over all the global domain
221
222         IF(lwp) WRITE(numout,*)'     Closed sea surfaces'
223         DO jc = 1, jpncs
224            IF(lwp) WRITE(numout,FMT='(1I3,4I4,5X,F16.2)')    &
225                jc, ncsi1(jc), ncsi2(jc), ncsj1(jc), ncsj2(jc), surf(jc)
226         END DO
227
228         ! jpncs+1 : surface of sea, closed seas excluded
229         DO jc = 1, jpncs
230            surf(jpncs+1) = surf(jpncs+1) - surf(jc)
231         END DO           
232 
233      ENDIF
234
235      ! 2 - Computation
236      ! ---------------
237      zemp = 0.e0
238
239      DO jc = 1, jpncs
240         DO jj = ncsj1(jc), ncsj2(jc)
241            DO ji = ncsi1(jc), ncsi2(jc)
242               zemp(jc) = zemp(jc) + e1t(ji,jj) * e2t(ji,jj) * emp(ji,jj) * tmask_i(ji,jj)
243            END DO 
244         END DO
245      END DO
246      IF( lk_mpp )   CALL mpp_sum ( zemp , jpncs )       ! mpp: sum over all the global domain
247
248      IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN      ! Black Sea case for ORCA_R2 configuration
249         zze2    = ( zemp(3) + zemp(4) ) / 2.
250         zemp(3) = zze2
251         zemp(4) = zze2
252      ENDIF
253
254      DO jc = 1, jpncs
255
256         IF( ncstt(jc) == 0 ) THEN 
257            ! water/evap excess is shared by all open ocean
258            emp (:,:) = emp (:,:) + zemp(jc) / surf(jpncs+1)
259            emps(:,:) = emps(:,:) + zemp(jc) / surf(jpncs+1)
260         ELSEIF( ncstt(jc) == 1 ) THEN 
261            ! Excess water in open sea, at outflow location, excess evap shared
262            IF ( zemp(jc) <= 0.e0 ) THEN
263                DO jn = 1, ncsnr(jc)
264                  ji = mi0(ncsir(jc,jn))
265                  jj = mj0(ncsjr(jc,jn)) ! Location of outflow in open ocean
266                  IF (      ji > 1 .AND. ji < jpi   &
267                      .AND. jj > 1 .AND. jj < jpj ) THEN
268                      emp (ji,jj) = emp (ji,jj) + zemp(jc) /   &
269                         (FLOAT(ncsnr(jc)) * e1t(ji,jj) * e2t(ji,jj))
270                      emps(ji,jj) = emps(ji,jj) + zemp(jc) /   &
271                          (FLOAT(ncsnr(jc)) * e1t(ji,jj) * e2t(ji,jj))
272                  END IF
273                END DO
274            ELSE
275                emp (:,:) = emp (:,:) + zemp(jc) / surf(jpncs+1)
276                emps(:,:) = emps(:,:) + zemp(jc) / surf(jpncs+1)
277            ENDIF
278         ELSEIF( ncstt(jc) == 2 ) THEN 
279            ! Excess e-p+r (either sign) goes to open ocean, at outflow location
280            IF(      ji > 1 .AND. ji < jpi    &
281               .AND. jj > 1 .AND. jj < jpj ) THEN
282                DO jn = 1, ncsnr(jc)
283                  ji = mi0(ncsir(jc,jn))
284                  jj = mj0(ncsjr(jc,jn)) ! Location of outflow in open ocean
285                  emp (ji,jj) = emp (ji,jj) + zemp(jc)   &
286                      / (FLOAT(ncsnr(jc)) *  e1t(ji,jj) * e2t(ji,jj) )
287                  emps(ji,jj) = emps(ji,jj) + zemp(jc)   &
288                      / (FLOAT(ncsnr(jc)) *  e1t(ji,jj) * e2t(ji,jj) )
289                END DO
290            ENDIF
291         ENDIF
292
293         DO jj = ncsj1(jc), ncsj2(jc)
294            DO ji = ncsi1(jc), ncsi2(jc)
295               emp (ji,jj) = emp (ji,jj) - zemp(jc) / surf(jc)
296               emps(ji,jj) = emps(ji,jj) - zemp(jc) / surf(jc)
297            END DO 
298         END DO
299
300      END DO 
301
302
303      ! 5. Boundary condition on emp and emps
304      ! -------------------------------------
305      CALL lbc_lnk( emp , 'T', 1. )
306      CALL lbc_lnk( emps, 'T', 1. )
307
308   END SUBROUTINE flx_clo
309
310   !!======================================================================
311END MODULE closea
Note: See TracBrowser for help on using the repository browser.