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.
flxrnf.F90 in trunk/NEMO/OPA_SRC/SBC – NEMO

source: trunk/NEMO/OPA_SRC/SBC/flxrnf.F90 @ 3

Last change on this file since 3 was 3, checked in by opalod, 20 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.9 KB
Line 
1MODULE flxrnf
2   !!======================================================================
3   !!                       ***  MODULE  flxrnf  ***
4   !! Ocean forcing:  runoff
5   !!=====================================================================
6#if defined key_orca_r05
7   !!----------------------------------------------------------------------
8   !!   'key_orca_r05'                               ORCA R05 configuration
9   !!----------------------------------------------------------------------
10#  include "flxrnf_ORCA_R05.h90"
11#else
12   !!----------------------------------------------------------------------
13   !!   Default option                                     Standard runoffs
14   !!----------------------------------------------------------------------
15
16   !!----------------------------------------------------------------------
17   !!   flx_rnf      : monthly runoff read in a NetCDF file
18   !!----------------------------------------------------------------------
19   !! * Modules used
20   USE dom_oce         ! ocean space and time domain
21   USE phycst          ! physical constants
22   USE in_out_manager  ! I/O manager
23   USE daymod          ! calendar
24   USE ioipsl          ! NetCDF IPSL library
25
26   IMPLICIT NONE
27   PRIVATE
28
29   !! * Shared module variables
30   PUBLIC flx_rnf         ! routine call by step.F90
31   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   &
32      runoff,          &  ! monthly runoff (kg/m2/s)
33      upsadv,          &  ! mixed adv scheme in straits vicinity (hori.)
34      upsrnfh             ! mixed adv scheme in runoffs vicinity (hori.)
35   REAL(wp), PUBLIC, DIMENSION(jpk) ::   &
36      upsrnfz             ! mixed adv scheme in runoffs vicinity (vert.)
37   INTEGER, PUBLIC ::   &
38      numrof  = 48 ,    &  ! logical unit for runoff data
39      nrunoff =  0 ,    &  ! runoff option (namelist)
40      nrnf1, nrnf2         ! first and second record used
41
42   !! * Module variable
43   REAL(wp), DIMENSION(jpi,jpj,2) ::   &
44      rnfdta              ! monthly runoff data array (kg/m2/s)
45   !!----------------------------------------------------------------------
46   !!   OPA 9.0 , LODYC-IPSL  (2003)
47   !!----------------------------------------------------------------------
48
49CONTAINS
50
51   SUBROUTINE flx_rnf( kt )
52      !!----------------------------------------------------------------------
53      !!                  ***  ROUTINE flx_rnf  ***
54      !!       
55      !! ** Purpose :   Introduce a climatological run off forcing
56      !!
57      !! ** Method :
58      !!      Initialze each mouth of river with a monthly climatology
59      !!      provided from different data.
60      !!     C a u t i o n : upward water flux, runoff is negative
61      !!                     set at the last loop of the routine
62      !!
63      !! ** Action :
64      !!
65      !! References :
66      !!       J. D. Milliman and R. H. Meade, 1983 : world-wide delivery
67      !!          of river sediment to the oceans, journal of geology vol 91
68      !!          pp 1-21.
69      !!       G. L. Russell and J. R. Miller, 1990 : global river runoff
70      !!          calculated from a global atmospheric general circulation
71      !!          model, journal of hydrology, 117(1990), pp 241-254.
72      !!       F. Van Der Leeden, Troise F. L., Todd D. K. : the water
73      !!          encyclopedia, second edition, lewis publishers.
74      !!       J. W. Weatherly, J. E. Walsh : The effects of precipitation
75      !!          and river runoff in a coupled ice-ocean model of Arctic
76      !!          Climate dynamics 1996 12:785,798
77      !!       Jacobs et al. 1992. J. Glaciol. 38 (130) 375-387.
78      !!
79      !! History :
80      !!        !  94-10  (G.Madec, M. Pontaud, M. Imbard)  Original code
81      !!        !  97-03  (G.Madec)  time dependent version
82      !!        !  98-06  (J.M. Molines)  exact computation of zxy
83      !!                         for months that are not 30 days
84      !!        !  98-07  (M. Imbard)  ORCA and mpp option
85      !!        !  99-08  (J.P. Boulanger H.L.Ayina)  New rivers and
86      !!                         values given in m3/s
87      !!        !  00-04  (G. Madec, K. Roberts) add antarctica ice discharge.
88      !!        !  00-11  (R. Hordoir, E. Durand)  NetCDF FORMAT
89      !!   8.5  !  02-09  (G. Madec)  F90: Free form and module
90      !!----------------------------------------------------------------------
91      !! * arguments
92      INTEGER, INTENT( in  ) ::   kt       ! ocean time step
93
94      !! * Local declarations
95# if ! defined key_coupled
96      INTEGER ::   &
97         i15 , imois , iman,            &  ! temporary integers
98         idbd, idmeom                      !    "          "
99      REAL(wp) ::   zxy
100# endif
101      CHARACTER (len=32) ::   &
102         clname = 'runoff_1m_nomask'       ! monthly runoff filename
103      INTEGER, PARAMETER :: jpmois = 12
104      INTEGER  ::   ji, jj                 ! dummy loop indices
105      INTEGER  ::   ipi, ipj, ipk          ! temporary integers
106      INTEGER, DIMENSION(jpmois) ::     &
107         istep                             ! temporary workspace
108      REAL(wp) ::   zdate0                 ! temporary scalars
109      REAL(wp), DIMENSION(jpk) ::       &
110         zlev                              ! temporary workspace
111      REAL(wp), DIMENSION(jpi,jpj) ::   &
112         zlon, zlat,                    &  ! temporary workspace
113         zcoefr                            ! coeff of advection link to runoff
114      !!----------------------------------------------------------------------
115     
116      IF( kt == nit000 ) THEN
117
118         SELECT CASE ( nrunoff )
119
120         CASE ( 0 )
121            IF(lwp) WRITE(numout,*)
122            IF(lwp) WRITE(numout,*) 'flx_rnf : No runoff in this simulation (nrunoff=0)'
123            IF(lwp) WRITE(numout,*) '~~~~~~~'
124           
125         CASE ( 1 )
126            IF(lwp) WRITE(numout,*)
127            IF(lwp) WRITE(numout,*) 'flx_rnf : monthly runoff (nrunoff=0)'
128            IF(lwp) WRITE(numout,*) '~~~~~~~'
129
130         CASE ( 2 )
131            IF(lwp) WRITE(numout,*)
132            IF(lwp) WRITE(numout,*) 'flx_rnf : monthly runoff with upsteam advection'
133            IF(lwp) WRITE(numout,*) '~~~~~~~   in the vicinity of river mouths (nrunoff=2)'
134
135         CASE DEFAULT
136            IF(lwp) WRITE(numout,cform_err)
137            IF(lwp) WRITE(numout,*)' Error nrunoff = ', nrunoff, ' /= 0, 1 or 2'
138            nstop = nstop + 1
139
140         END SELECT
141
142         ! Set runoffs and upstream coeff to zero
143         runoff (:,:) = 0.e0
144         upsrnfh(:,:) = 0.e0
145         upsrnfz(:)   = 0.e0 
146         upsadv (:,:) = 0.e0
147
148      ENDIF
149
150
151      ! 1. Initialization
152      ! -----------------
153
154      IF( nrunoff == 1 .OR. nrunoff == 2 ) THEN
155# if ! defined key_coupled
156
157         ! year, month, day
158
159         iman  = jpmois
160         i15   = nday / 16
161         imois = nmonth + i15 - 1
162         IF( imois == 0 )   imois = iman
163         ! Number of days in the month
164         IF( nleapy == 1 .AND. MOD( nyear, 4 ) == 0 ) THEN
165            idbd = nbiss(imois)
166         ELSEIF( nleapy > 1 ) THEN
167            idbd = nleapy
168         ELSE
169            idbd = nobis(imois)
170         ENDIF
171         ! Number of days between imois, 15 and the end of month
172         idmeom = idbd - 15
173# endif
174         ipi = jpiglo
175         ipj = jpjglo
176         ipk = jpk
177         
178         ! Open file
179
180         IF( kt == nit000 ) THEN
181            CALL flinopen( clname, mig(1), nlci, mjg(1), nlcj,    &
182                           .false., ipi, ipj, ipk, zlon,        &
183                           zlat, zlev, jpmois, istep, zdate0,   &
184                           rdt, numrof )
185            !   Title, dimensions and tests
186# if ! defined key_coupled
187            IF( iman /= jpmois ) THEN
188               IF(lwp) WRITE(numout,*)
189               IF(lwp) WRITE(numout,*) 'problem with time coordinates'
190               IF(lwp) WRITE(numout,*) ' iman ', iman, ' jpmois ', jpmois
191               nstop = nstop + 1
192            ENDIF
193            IF(lwp) WRITE(numout,*) iman, istep, zdate0, rdt, numrof
194            IF(lwp) WRITE(numout,*) 'numrof=', numrof
195            IF(lwp) WRITE(numout,*) 'jpmois=', jpmois
196            IF(lwp) WRITE(numout,*) 'rdt=', rdt
197# endif
198            IF(ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1) THEN
199               IF(lwp)WRITE(numout,*) ' '
200               IF(lwp)WRITE(numout,*) 'problem with dimensions'
201               IF(lwp)WRITE(numout,*) ' ipi ', ipi, ' jpidta ', jpidta
202               IF(lwp)WRITE(numout,*) ' ipj ', ipj, ' jpjdta ', jpjdta
203               IF(lwp)WRITE(numout,*) ' ipk ', ipk, ' =? 1'
204               nstop = nstop + 1
205            ENDIF
206            IF(lwp)WRITE(numout,*) 'ipi=', ipi, ' ipj=', ipj, ' ipk=', ipk
207         ENDIF
208         
209# if ! defined key_coupled
210
211         ! 2. Read monthly file of runoff
212         ! ------------------------------
213
214         IF( kt == nit000 .OR. imois /= nrnf1 ) THEN
215
216            ! Calendar computation for interpolation
217            !     nrnf1 number of the first array record used in the simulation
218            !     nrnf2 number of the last  array record
219
220            nrnf1 = imois
221            nrnf2 = nrnf1 + 1
222            nrnf1 = MOD( nrnf1, iman )
223            IF( nrnf1 == 0 ) nrnf1 = iman
224            nrnf2 = MOD( nrnf2, iman )
225            IF( nrnf2 == 0 ) nrnf2 = iman
226           
227            IF(lwp) THEN
228               WRITE(numout,*)
229               WRITE(numout,*) ' runoff monthly field'
230               WRITE(numout,*) ' --------------------'
231               WRITE(numout,*) ' NetCDF format'
232               WRITE(numout,*)
233               WRITE(numout,*) 'first array record used nrnf1 ',nrnf1
234               WRITE(numout,*) 'last  array record used nrnf2 ',nrnf2
235               WRITE(numout,*)
236            ENDIF
237           
238            ! Read monthly runoff data in kg/m2/s
239
240            CALL flinget(numrof,'sorunoff',jpidta,jpjdta,1,jpmois   &
241                  ,nrnf1,nrnf1,mig(1),nlci,mjg(1),nlcj,rnfdta(1:nlci,1:nlcj,1))
242            CALL flinget(numrof,'sorunoff',jpidta,jpjdta,1,jpmois   &
243                  ,nrnf2,nrnf2,mig(1),nlci,mjg(1),nlcj,rnfdta(1:nlci,1:nlcj,2))
244
245            IF(lwp) WRITE(numout,*)
246            IF(lwp) WRITE(numout,*) ' read runoff field ok'
247            IF(lwp) WRITE(numout,*)
248
249         ENDIF
250
251         ! Linear interpolation and conversion in upward water flux
252         ! C a u t i o n : runoff is negative and in kg/m2/s
253
254         zxy = FLOAT( nday + idmeom - idbd * i15 ) / idbd
255
256         runoff(:,:) = -( (1.-zxy)*rnfdta(:,:,1) + zxy*rnfdta(:,:,2) )
257
258         ! Runoff reduction
259         DO jj = 1, jpj
260            DO ji = 1, jpi
261               IF( gphit(ji,jj) > 40 .AND. gphit(ji,jj) < 65 ) THEN
262                  runoff(ji,jj) = 0.85 * runoff(ji,jj)
263               ENDIF
264            END DO
265         END DO
266         
267# endif
268
269      ENDIF
270
271
272      ! 3. Mixed advection scheme
273      ! -------------------------
274
275      IF( nrunoff == 2 .AND. kt == nit000 ) THEN
276
277         ! Upstream and centered scheme in the vicinity of river mouths
278
279         !  Creates the array coef that contains the coefficient to affect to
280         !  the upstream scheme. advection scheme will be:
281         !  coefr * upstream + (1- coefr) centered
282         !  coefr must be between 0 and 1.
283
284         CALL flinget(numrof,'socoefr',jpidta,jpjdta,1,jpmois,nrnf1   &
285                     ,nrnf1,mig(1),nlci,mjg(1),nlcj,zcoefr(1:nlci,1:nlcj))
286
287         IF(lwp) WRITE(numout,*)
288         IF(lwp) WRITE(numout,*) ' read coefr for advection ok'
289         IF(lwp) WRITE(numout,*)
290         
291         upsrnfh(:,:) = zcoefr(:,:)
292         upsrnfz(:)   = 0.e0
293         upsrnfz(1)   = 1.0
294         upsrnfz(2)   = 1.0
295         upsrnfz(3)   = 0.5
296         upsrnfz(4)   = 0.25
297         upsrnfz(5)   = 0.125
298         
299         IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN
300            ! ORCA_R2 configuration :
301            ! upstream scheme in the Sound Strait
302            upsrnfh( mi0(144):mi1(144) , mj0(116):mj1(116) ) = 0.25
303            upsrnfh( mi0(145):mi1(147) , mj0(116):mj1(116) ) = 0.50
304            upsrnfh( mi0(148):mi1(148) , mj0(116):mj1(116) ) = 0.25
305         ENDIF
306
307      ENDIF
308
309      ! Upstream and centered scheme in the vicinity of some straits
310
311      IF( kt == nit000 ) THEN
312
313         IF( cp_cfg == "orca" ) THEN
314
315            SELECT CASE ( jp_cfg )
316            !                                        ! =======================
317            CASE ( 4 )                               !  ORCA_R4 configuration
318               !                                     ! =======================
319
320               !                                                       ! Gibraltar Strait
321               upsadv( mi0(70):mi1(71) , mj0(52):mj1(53) ) = 0.50
322         
323               !                                     ! =======================
324            CASE ( 2 )                               !  ORCA_R2 configuration
325               !                                     ! =======================
326
327               !                                          ! Gibraltar Strait
328               upsadv( mi0(138):mi1(138) , mj0(102):mj1(102) ) = 0.20
329               upsadv( mi0(139):mi1(139) , mj0(102):mj1(102) ) = 0.40
330               upsadv( mi0(140):mi1(140) , mj0(102):mj1(102) ) = 0.50
331               upsadv( mi0(141):mi1(141) , mj0(101):mj1(102) ) = 0.50
332
333               !                                          ! Bab el Mandeb Strait
334               upsadv( mi0(164):mi1(164) , mj0( 87):mj1( 88) ) = 0.10
335               upsadv( mi0(163):mi1(163) , mj0( 88):mj1( 88) ) = 0.25
336               upsadv( mi0(162):mi1(162) , mj0( 88):mj1( 88) ) = 0.40
337               upsadv( mi0(160):mi1(161) , mj0( 88):mj1( 88) ) = 0.50
338               upsadv( mi0(158):mi1(160) , mj0( 89):mj1( 89) ) = 0.25
339               upsadv( mi0(160):mi1(160) , mj0( 90):mj1( 90) ) = 0.25
340
341               !                                          ! Sound Strait
342               upsadv( mi0(145):mi1(147) , mj0(116):mj1(116) ) = 0.50
343         
344            END SELECT
345
346         ENDIF
347
348      ENDIF
349     
350      ! 4. Closing all files
351      ! --------------------
352
353      IF( kt == nitend .AND. nrunoff >= 1 )   CALL flinclo( numrof )
354
355   END SUBROUTINE flx_rnf
356
357#endif
358   !!======================================================================
359END MODULE flxrnf
Note: See TracBrowser for help on using the repository browser.