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 @ 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:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 12.6 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 = 'tair_1d.nc',        &
82         clname_c = 'hum_cloud_1m.nc',   &
83         clname_x = 'rain_1m.nc',        &
84         clname_w = 'wspd_1d.nc'
85      !!---------------------------------------------------------------------
86
87
88      ! Initialization
89      ! --------------
90
91      i15 = INT(2*FLOAT(nday)/(FLOAT(nobis(nmonth))+0.5))
92      itime = jpday
93      ipi = jpiglo
94      ipj = jpjglo
95      ipk = jpk
96      idy = 365
97      IF(nleapy == 1) idy = 366
98
99      iman = 12
100      imois = nmonth + i15 - 1
101      IF (imois == 0) imois = iman
102      imois2 = nmonth
103
104
105      ! 1. first call kt = nit000
106      ! -----------------------
107     
108      IF( kt == nit000 ) THEN
109         
110         nflx1 = 0
111         nflx11 = 0
112         
113         IF(lwp) THEN
114            WRITE(numout,*) ' '
115            WRITE(numout,*) ' **** Routine flx.forced.ncep_clio_xie.h90'
116            WRITE(numout,*) ' **** global NCEP flx  daily fields '
117            WRITE(numout,*) ' **** global CLIO flx  monthly fields '
118            WRITE(numout,*) ' **** global XIE  flx  monthly fields '
119            WRITE(numout,*) ' --------------------------------'
120            WRITE(numout,*) ' NetCDF FORMAT'
121            WRITE(numout,*) ' '
122         ENDIF
123         
124         ! open NCEP file
125          CALL flinopen(clname_n,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj &
126             ,ipk,zlon,zlat,zlev,itime,istep_n,zdate0,rdt,numfl1)
127
128          IF( itime /= jpday .AND. itime /= jpday+1 ) THEN
129             IF(lwp) THEN
130                WRITE(numout,*) ' '
131                WRITE(numout,*) 'problem with time coordinates '
132                WRITE(numout,*) ' itime ',itime,' jpday ',jpday
133                WRITE(numout,*) ' Check in file', clname_n
134             ENDIF
135             STOP 'flx_bulk_daily.h90'
136          ENDIF
137          IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN
138          IF(lwp) THEN
139             WRITE(numout,*) ' '
140             WRITE(numout,*) 'problem with dimensions'
141             WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
142             WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
143             WRITE(numout,*) ' ipk ',ipk,' =? 1'
144             WRITE(numout,*) ' Check in file', clname_n
145          ENDIF
146          STOP 'flx_bulk_daily.h90'
147       ENDIF
148
149       ! open CLIO file
150       CALL flinopen(clname_c,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj &
151          ,ipk,zlon,zlat,zlev,itime,istep_c,zdate0,rdt,numfl2)
152       
153       IF( itime /= jpmois ) THEN
154          IF(lwp) THEN
155             WRITE(numout,*) ' '
156             WRITE(numout,*) 'problem with time coordinates '
157             WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois
158             WRITE(numout,*) ' Check in file', clname_c
159          ENDIF
160          STOP 'flx_bulk_daily.h90'
161       ENDIF
162       IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN
163          IF(lwp) THEN
164             WRITE(numout,*) ' '
165             WRITE(numout,*) 'problem with dimensions'
166             WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
167             WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
168             WRITE(numout,*) ' ipk ',ipk,' =? 1'
169             WRITE(numout,*) ' Check in file', clname_c
170          ENDIF
171          STOP 'flx_bulk_daily.h90'
172       ENDIF
173       
174       ! open CMAP FILE
175       CALL flinopen(clname_x,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj &
176          ,ipk,zlon,zlat,zlev,itime,istep_x,zdate0,rdt,numfl3)
177
178       IF( itime /= jpmois ) THEN
179          IF(lwp) THEN
180             WRITE(numout,*) ' '
181             WRITE(numout,*) 'problem with time coordinates '
182             WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois
183             WRITE(numout,*) ' Check in file', clname_x
184          ENDIF
185          STOP 'flx_bulk_daily.h90'
186       ENDIF
187       IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN
188          IF(lwp) THEN
189             WRITE(numout,*) ' '
190             WRITE(numout,*) 'problem with dimensions'
191             WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
192             WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
193             WRITE(numout,*) ' ipk ',ipk,' =? 1'
194             WRITE(numout,*) ' Check in file', clname_x
195          ENDIF
196          STOP 'flx_bulk_daily.h90'
197       ENDIF
198
199       ! open ERS-NCEP file
200       CALL flinopen(clname_w,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj &
201             ,ipk,zlon,zlat,zlev,itime,istep_n,zdate0,rdt,numfl4)
202
203       IF( itime /= jpday .AND. itime /= jpday+1 ) THEN
204          IF(lwp) THEN
205             WRITE(numout,*) ' '
206             WRITE(numout,*) 'problem with time coordinates '
207             WRITE(numout,*) ' itime ',itime,' jpday ',jpday
208             WRITE(numout,*) ' Check in file', clname_w
209          ENDIF
210          STOP 'flx_bulk_daily.h90'
211       ENDIF
212       IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN
213          IF(lwp) THEN
214             WRITE(numout,*) ' '
215             WRITE(numout,*) 'problem with dimensions'
216             WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
217             WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
218             WRITE(numout,*) ' ipk ',ipk,' =? 1'
219             WRITE(numout,*) ' Check in file', clname_w
220          ENDIF
221          STOP 'flx_bulk_daily.h90'
222       ENDIF
223
224    ENDIF
225
226
227    ! 2. Read daily DATA Temperature from NCEP
228    ! ---------------------------------------
229
230    IF( ndayflx /= nday ) THEN
231
232       ndayflx = nday
233       iday    = nday_year
234
235       ! read T 2m (Caution in K)
236       CALL flinget(numfl1,'air',jpidta,jpjdta,1,jpday,iday, &
237          iday,mig(1),nlci,mjg(1),nlcj,tatm(1:nlci,1:nlcj))
238
239       IF(lwp) WRITE (numout,*)' Lecture daily flx record OK :',iday
240       IF(lwp) WRITE (numout,*)' '
241
242       ! conversion of temperature Kelvin --> Celsius  [rt0=273.15]
243       tatm(:,:) = ( tatm(:,:) - rt0 )
244
245       ! read wind speed
246       CALL flinget(numfl4,'wspd',jpidta,jpjdta,1,jpday,iday, &
247          iday,mig(1),nlci,mjg(1),nlcj,vatm(1:nlci,1:nlcj))
248
249       IF(lwp) WRITE (numout,*)' Lecture daily wind speed flx :',iday
250       IF(lwp) WRITE (numout,*)' '
251
252       ! Extra-halo initialization in MPP
253       IF( lk_mpp ) THEN
254          DO ji = nlci+1, jpi
255             tatm(ji,:) = tatm(1,:)
256             vatm(ji,:) = vatm(1,:)
257          ENDDO
258          DO jj = nlcj+1, jpj
259             tatm(:,jj) = tatm(:,1)
260             vatm(:,jj) = vatm(:,1)
261          ENDDO
262       ENDIF
263         
264    ENDIF
265
266
267    !  3. Read monthly data from CLIO and From Xie
268    !  -------------------------------------------
269
270      IF( kt == nit000 .OR. imois /= nflx1 ) THEN
271
272         ! calendar computation
273
274         ! nflx1 number of the first file record used in the simulation
275         ! flx2 number of the last  file record
276
277         nflx1 = imois
278         nflx2 = nflx1+1
279         nflx1 = MOD(nflx1,iman)
280         IF ( nflx1 == 0 ) nflx1 = iman
281         nflx2 = MOD(nflx2,iman)
282         IF ( nflx2 == 0 ) nflx2 = iman
283         IF(lwp)WRITE(numout,*) 'first record file used nflx1 ',nflx1
284         IF(lwp)WRITE(numout,*) 'last  record file used nflx2 ',nflx2
285
286         ! Read monthly fluxes data Esbensen Kushnir
287
288         ! humidity
289         CALL flinget(numfl2,'socliohu',jpidta,jpjdta,jpk,jpmois,nflx1, &
290            nflx1,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,1,1))
291         CALL flinget(numfl2,'socliohu',jpidta,jpjdta,jpk,jpmois,nflx2, &
292            nflx2,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,2,1))
293
294         ! clouds
295         CALL flinget(numfl2,'socliocl',jpidta,jpjdta,jpk,jpmois,nflx1, &
296            nflx1,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,1,2))
297         CALL flinget(numfl2,'socliocl',jpidta,jpjdta,jpk,jpmois,nflx2, &
298            nflx2,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,2,2))
299
300         ! Read monthly precipitations ds flxdta(:,:,1 ou 2,4)
301
302         CALL flinget(numfl3,'rain',jpidta,jpjdta,jpk,jpmois,nflx1, &
303            nflx1,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,1,3))
304         CALL flinget(numfl3,'rain',jpidta,jpjdta,jpk,jpmois,nflx2, &
305            nflx2,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,2,3))
306
307         ! Extra-halo initialization in MPP
308         IF( lk_mpp ) THEN
309            DO ji = nlci+1, jpi
310               flxdta(ji,:,1,1) = flxdta(1,:,1,1)   ;   flxdta(ji,:,2,1) = flxdta(1,:,2,1)
311               flxdta(ji,:,1,2) = flxdta(1,:,1,2)   ;   flxdta(ji,:,2,2) = flxdta(1,:,2,2)
312               flxdta(ji,:,1,3) = flxdta(1,:,1,3)   ;   flxdta(ji,:,2,3) = flxdta(1,:,2,3)
313            ENDDO
314            DO jj = nlcj+1, jpj
315               flxdta(:,jj,1,1) = flxdta(:,1,1,1)   ;   flxdta(:,jj,2,1) = flxdta(:,1,2,1)
316               flxdta(:,jj,1,2) = flxdta(:,1,1,2)   ;   flxdta(:,jj,2,2) = flxdta(:,1,2,2)
317               flxdta(:,jj,1,3) = flxdta(:,1,1,3)   ;   flxdta(:,jj,2,3) = flxdta(:,1,2,3)
318            ENDDO
319         ENDIF
320                 
321      ENDIF
322
323
324      ! 3. at every time step linear interpolation of precipitation fluxes
325      ! -----------------------------------------------------------
326     
327      zxy = FLOAT(nday) / FLOAT(nobis(nflx1)) + 0.5 - i15
328
329      hatm(:,:) = ( (1.-zxy) * flxdta(:,:,1,1) + zxy  * flxdta(:,:,2,1) )
330      catm(:,:) = ( (1.-zxy )* flxdta(:,:,1,2) + zxy  * flxdta(:,:,2,2) ) 
331      watm(:,:) = ( (1.-zxy) * flxdta(:,:,1,3) + zxy  * flxdta(:,:,2,3) )
332
333      ! 4. Closing all files
334      ! --------------------
335
336      IF( kt == nitend ) THEN
337         CALL flinclo(numfl1)
338         CALL flinclo(numfl2)
339         CALL flinclo(numfl3)
340      ENDIF
341
342      CALL blk(kt)
343     
344      CALL FLUSH(numout)
345     
346   END SUBROUTINE flx
347   
Note: See TracBrowser for help on using the repository browser.