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

source: trunk/NEMO/OPA_SRC/SBC/flx_bulk_daily.h90 @ 389

Last change on this file since 389 was 389, checked in by opalod, 18 years ago

RB:nemo_v1_update_038: first integration of Agrif :

  • configuration parameters are just integer when agrif is used
  • add call to agrif routines with key_agrif
  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 12.8 KB
Line 
1   !!----------------------------------------------------------------------
2   !!                    ***  flx_bulk_daily  ***
3   !!----------------------------------------------------------------------
4
5   !!----------------------------------------------------------------------
6   !!   bulk          : reading
7   !!----------------------------------------------------------------------
8   !! * Modules used     C A U T I O N  already defined in flxmod.F90
9
10   !! * Module variables
11   
12   INTEGER ::          &
13      ji, jj,          &  ! loop indices
14      numfl1, numfl2,  &  ! logical units for surface fluxes data
15      numfl3, numfl4,  &  !
16      nflx1, nflx2,    &  !  first and second record used
17      nflx11, nflx12 , &  ! ???
18      ndayflx
19
20   REAL(wp), DIMENSION(jpi,jpj,2,3) ::   &
21      flxdta              ! 2 consecutive set of CLIO/CMAP monthly fluxes
22   !!----------------------------------------------------------------------
23   !!   OPA 9.0 , LOCEAN-IPSL (2005)
24   !! $Header$
25   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
26   !!----------------------------------------------------------------------
27
28CONTAINS
29
30   SUBROUTINE flx( kt )
31      !!---------------------------------------------------------------------
32      !!                    ***  ROUTINE flx  ***
33      !!       
34      !! ** Purpose :   provide the thermohaline fluxes (heat and freshwater)
35      !!      to the ocean at each time step.
36      !!
37      !! ** Method :
38      !!       ORCA FORCED VERSION WITH :
39      !!       Daily climatological NCEP temperature
40      !!       Daily climatological ERS-NCEP winds
41      !!       monthly climatological humidity and clouds
42      !!       monthly climatological CMAP precipitation
43      !!       Read several AGCM daily and monthly fluxes file
44      !!             temperature at 2m   tatm   (K)
45      !!             relative humidite   hatm   (%)
46      !!             wind speed          vatm   (m/s)
47      !!             monthly precip      watm   (kg/m2/day)  from Xie/Arkin
48      !!             clouds              catm   (%)
49      !!
50      !! caution : now, in the opa global model, the net upward water flux is
51      !! -------   with mm/day unit.
52      !!
53      !! History :
54      !!        !  91-03  (O. Marti and Ph Dandin)  Original code
55      !!        !  92-07  (M. Imbard)
56      !!        !  96-11  (E. Guilyardi)  Daily AGCM input files
57      !!        !  99-11  (M. Imbard)  NetCDF FORMAT with ioipsl
58      !!        !  00-05  (K. Rodgers) Daily Netcdf
59      !!   8.5  !  02-09  (C. Ethe and G. Madec)  F90: Free form and MODULE
60      !!----------------------------------------------------------------------
61      !! * modules used
62      USE ioipsl          ! NetCDF IPSL library
63      USE blk_oce         ! bulk variable
64      USE bulk            ! bulk module
65
66      !! * arguments
67      INTEGER, INTENT( in  ) ::   kt ! ocean time step
68
69      !! * Local declarations     
70      INTEGER , PARAMETER :: jpday  = 365, jpmois = 12
71      INTEGER  ::   i15,iday, idy
72      INTEGER  ::   ipi,ipj,ipk
73      INTEGER  ::   iman,imois,imois2
74      INTEGER, DIMENSION(jpday) :: istep_n
75      INTEGER, DIMENSION(jpmois):: istep_c, istep_x
76      INTEGER  ::   itime
77      REAL(wp) ::   zdate0, zxy
78      REAL(wp), DIMENSION(jpi,jpj) ::   zlon, zlat   ! ???
79      REAL(wp), DIMENSION(jpk) ::   zlev           ! ???
80      CHARACTER(len=45)  ::  &
81         clname_n ,        &
82         clname_c ,   &
83         clname_x ,        &
84         clname_w
85      !!---------------------------------------------------------------------
86         clname_n = 'tair_1d.nc'
87         clname_c = 'hum_cloud_1m.nc'
88         clname_x = 'rain_1m.nc'
89         clname_w = 'wspd_1d.nc'
90      !!---------------------------------------------------------------------
91
92
93      ! Initialization
94      ! --------------
95
96      i15 = INT(2*FLOAT(nday)/(FLOAT(nobis(nmonth))+0.5))
97      itime = jpday
98      ipi = jpiglo
99      ipj = jpjglo
100      ipk = jpk
101      idy = 365
102      IF(nleapy == 1) idy = 366
103
104      iman = 12
105      imois = nmonth + i15 - 1
106      IF (imois == 0) imois = iman
107      imois2 = nmonth
108
109
110      ! 1. first call kt = nit000
111      ! -----------------------
112     
113      IF( kt == nit000 ) THEN
114         
115         nflx1 = 0
116         nflx11 = 0
117         
118         IF(lwp) THEN
119            WRITE(numout,*) ' '
120            WRITE(numout,*) ' **** Routine flx.forced.ncep_clio_xie.h90'
121            WRITE(numout,*) ' **** global NCEP flx  daily fields '
122            WRITE(numout,*) ' **** global CLIO flx  monthly fields '
123            WRITE(numout,*) ' **** global XIE  flx  monthly fields '
124            WRITE(numout,*) ' --------------------------------'
125            WRITE(numout,*) ' NetCDF FORMAT'
126            WRITE(numout,*) ' '
127         ENDIF
128         
129         ! open NCEP file
130          CALL flinopen(clname_n,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj &
131             ,ipk,zlon,zlat,zlev,itime,istep_n,zdate0,rdt,numfl1)
132
133          IF( itime /= jpday .AND. itime /= jpday+1 ) THEN
134             IF(lwp) THEN
135                WRITE(numout,*) ' '
136                WRITE(numout,*) 'problem with time coordinates '
137                WRITE(numout,*) ' itime ',itime,' jpday ',jpday
138                WRITE(numout,*) ' Check in file', clname_n
139             ENDIF
140             STOP 'flx_bulk_daily.h90'
141          ENDIF
142          IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN
143          IF(lwp) THEN
144             WRITE(numout,*) ' '
145             WRITE(numout,*) 'problem with dimensions'
146             WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
147             WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
148             WRITE(numout,*) ' ipk ',ipk,' =? 1'
149             WRITE(numout,*) ' Check in file', clname_n
150          ENDIF
151          STOP 'flx_bulk_daily.h90'
152       ENDIF
153
154       ! open CLIO file
155       CALL flinopen(clname_c,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj &
156          ,ipk,zlon,zlat,zlev,itime,istep_c,zdate0,rdt,numfl2)
157       
158       IF( itime /= jpmois ) THEN
159          IF(lwp) THEN
160             WRITE(numout,*) ' '
161             WRITE(numout,*) 'problem with time coordinates '
162             WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois
163             WRITE(numout,*) ' Check in file', clname_c
164          ENDIF
165          STOP 'flx_bulk_daily.h90'
166       ENDIF
167       IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN
168          IF(lwp) THEN
169             WRITE(numout,*) ' '
170             WRITE(numout,*) 'problem with dimensions'
171             WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
172             WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
173             WRITE(numout,*) ' ipk ',ipk,' =? 1'
174             WRITE(numout,*) ' Check in file', clname_c
175          ENDIF
176          STOP 'flx_bulk_daily.h90'
177       ENDIF
178       
179       ! open CMAP FILE
180       CALL flinopen(clname_x,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj &
181          ,ipk,zlon,zlat,zlev,itime,istep_x,zdate0,rdt,numfl3)
182
183       IF( itime /= jpmois ) THEN
184          IF(lwp) THEN
185             WRITE(numout,*) ' '
186             WRITE(numout,*) 'problem with time coordinates '
187             WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois
188             WRITE(numout,*) ' Check in file', clname_x
189          ENDIF
190          STOP 'flx_bulk_daily.h90'
191       ENDIF
192       IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN
193          IF(lwp) THEN
194             WRITE(numout,*) ' '
195             WRITE(numout,*) 'problem with dimensions'
196             WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
197             WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
198             WRITE(numout,*) ' ipk ',ipk,' =? 1'
199             WRITE(numout,*) ' Check in file', clname_x
200          ENDIF
201          STOP 'flx_bulk_daily.h90'
202       ENDIF
203
204       ! open ERS-NCEP file
205       CALL flinopen(clname_w,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj &
206             ,ipk,zlon,zlat,zlev,itime,istep_n,zdate0,rdt,numfl4)
207
208       IF( itime /= jpday .AND. itime /= jpday+1 ) THEN
209          IF(lwp) THEN
210             WRITE(numout,*) ' '
211             WRITE(numout,*) 'problem with time coordinates '
212             WRITE(numout,*) ' itime ',itime,' jpday ',jpday
213             WRITE(numout,*) ' Check in file', clname_w
214          ENDIF
215          STOP 'flx_bulk_daily.h90'
216       ENDIF
217       IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN
218          IF(lwp) THEN
219             WRITE(numout,*) ' '
220             WRITE(numout,*) 'problem with dimensions'
221             WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
222             WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
223             WRITE(numout,*) ' ipk ',ipk,' =? 1'
224             WRITE(numout,*) ' Check in file', clname_w
225          ENDIF
226          STOP 'flx_bulk_daily.h90'
227       ENDIF
228
229    ENDIF
230
231
232    ! 2. Read daily DATA Temperature from NCEP
233    ! ---------------------------------------
234
235    IF( ndayflx /= nday ) THEN
236
237       ndayflx = nday
238       iday    = nday_year
239
240       ! read T 2m (Caution in K)
241       CALL flinget(numfl1,'air',jpidta,jpjdta,1,jpday,iday, &
242          iday,mig(1),nlci,mjg(1),nlcj,tatm(1:nlci,1:nlcj))
243
244       IF(lwp) WRITE (numout,*)' Lecture daily flx record OK :',iday
245       IF(lwp) WRITE (numout,*)' '
246
247       ! conversion of temperature Kelvin --> Celsius  [rt0=273.15]
248       tatm(:,:) = ( tatm(:,:) - rt0 )
249
250       ! read wind speed
251       CALL flinget(numfl4,'wspd',jpidta,jpjdta,1,jpday,iday, &
252          iday,mig(1),nlci,mjg(1),nlcj,vatm(1:nlci,1:nlcj))
253
254       IF(lwp) WRITE (numout,*)' Lecture daily wind speed flx :',iday
255       IF(lwp) WRITE (numout,*)' '
256
257       ! Extra-halo initialization in MPP
258       IF( lk_mpp ) THEN
259          DO ji = nlci+1, jpi
260             tatm(ji,:) = tatm(1,:)
261             vatm(ji,:) = vatm(1,:)
262          ENDDO
263          DO jj = nlcj+1, jpj
264             tatm(:,jj) = tatm(:,1)
265             vatm(:,jj) = vatm(:,1)
266          ENDDO
267       ENDIF
268         
269    ENDIF
270
271
272    !  3. Read monthly data from CLIO and From Xie
273    !  -------------------------------------------
274
275      IF( kt == nit000 .OR. imois /= nflx1 ) THEN
276
277         ! calendar computation
278
279         ! nflx1 number of the first file record used in the simulation
280         ! flx2 number of the last  file record
281
282         nflx1 = imois
283         nflx2 = nflx1+1
284         nflx1 = MOD(nflx1,iman)
285         IF ( nflx1 == 0 ) nflx1 = iman
286         nflx2 = MOD(nflx2,iman)
287         IF ( nflx2 == 0 ) nflx2 = iman
288         IF(lwp)WRITE(numout,*) 'first record file used nflx1 ',nflx1
289         IF(lwp)WRITE(numout,*) 'last  record file used nflx2 ',nflx2
290
291         ! Read monthly fluxes data Esbensen Kushnir
292
293         ! humidity
294         CALL flinget(numfl2,'socliohu',jpidta,jpjdta,jpk,jpmois,nflx1, &
295            nflx1,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,1,1))
296         CALL flinget(numfl2,'socliohu',jpidta,jpjdta,jpk,jpmois,nflx2, &
297            nflx2,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,2,1))
298
299         ! clouds
300         CALL flinget(numfl2,'socliocl',jpidta,jpjdta,jpk,jpmois,nflx1, &
301            nflx1,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,1,2))
302         CALL flinget(numfl2,'socliocl',jpidta,jpjdta,jpk,jpmois,nflx2, &
303            nflx2,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,2,2))
304
305         ! Read monthly precipitations ds flxdta(:,:,1 ou 2,4)
306
307         CALL flinget(numfl3,'rain',jpidta,jpjdta,jpk,jpmois,nflx1, &
308            nflx1,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,1,3))
309         CALL flinget(numfl3,'rain',jpidta,jpjdta,jpk,jpmois,nflx2, &
310            nflx2,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,2,3))
311
312         ! Extra-halo initialization in MPP
313         IF( lk_mpp ) THEN
314            DO ji = nlci+1, jpi
315               flxdta(ji,:,1,1) = flxdta(1,:,1,1)   ;   flxdta(ji,:,2,1) = flxdta(1,:,2,1)
316               flxdta(ji,:,1,2) = flxdta(1,:,1,2)   ;   flxdta(ji,:,2,2) = flxdta(1,:,2,2)
317               flxdta(ji,:,1,3) = flxdta(1,:,1,3)   ;   flxdta(ji,:,2,3) = flxdta(1,:,2,3)
318            ENDDO
319            DO jj = nlcj+1, jpj
320               flxdta(:,jj,1,1) = flxdta(:,1,1,1)   ;   flxdta(:,jj,2,1) = flxdta(:,1,2,1)
321               flxdta(:,jj,1,2) = flxdta(:,1,1,2)   ;   flxdta(:,jj,2,2) = flxdta(:,1,2,2)
322               flxdta(:,jj,1,3) = flxdta(:,1,1,3)   ;   flxdta(:,jj,2,3) = flxdta(:,1,2,3)
323            ENDDO
324         ENDIF
325                 
326      ENDIF
327
328
329      ! 3. at every time step linear interpolation of precipitation fluxes
330      ! -----------------------------------------------------------
331     
332      zxy = FLOAT(nday) / FLOAT(nobis(nflx1)) + 0.5 - i15
333
334      hatm(:,:) = ( (1.-zxy) * flxdta(:,:,1,1) + zxy  * flxdta(:,:,2,1) )
335      catm(:,:) = ( (1.-zxy )* flxdta(:,:,1,2) + zxy  * flxdta(:,:,2,2) ) 
336      watm(:,:) = ( (1.-zxy) * flxdta(:,:,1,3) + zxy  * flxdta(:,:,2,3) )
337
338      ! 4. Closing all files
339      ! --------------------
340
341      IF( kt == nitend ) THEN
342         CALL flinclo(numfl1)
343         CALL flinclo(numfl2)
344         CALL flinclo(numfl3)
345      ENDIF
346
347      CALL blk(kt)
348     
349      CALL FLUSH(numout)
350     
351   END SUBROUTINE flx
352   
Note: See TracBrowser for help on using the repository browser.