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 tags/nemo_v1_13_dev1/NEMO/OPA_SRC/SBC – NEMO

source: tags/nemo_v1_13_dev1/NEMO/OPA_SRC/SBC/flx_bulk_daily.h90 @ 9126

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

nemo_v1_bugfix_039:RB: add input name modification with agrif for flx_bulk_daily

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 13.3 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#if defined key_agrif
130      if ( .NOT. Agrif_Root() ) then
131         clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname_n)
132      endif
133#endif 
134         
135         ! open NCEP file
136          CALL flinopen(clname_n,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj &
137             ,ipk,zlon,zlat,zlev,itime,istep_n,zdate0,rdt,numfl1)
138
139          IF( itime /= jpday .AND. itime /= jpday+1 ) THEN
140             IF(lwp) THEN
141                WRITE(numout,*) ' '
142                WRITE(numout,*) 'problem with time coordinates '
143                WRITE(numout,*) ' itime ',itime,' jpday ',jpday
144                WRITE(numout,*) ' Check in file', clname_n
145             ENDIF
146             STOP 'flx_bulk_daily.h90'
147          ENDIF
148          IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN
149          IF(lwp) THEN
150             WRITE(numout,*) ' '
151             WRITE(numout,*) 'problem with dimensions'
152             WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
153             WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
154             WRITE(numout,*) ' ipk ',ipk,' =? 1'
155             WRITE(numout,*) ' Check in file', clname_n
156          ENDIF
157          STOP 'flx_bulk_daily.h90'
158       ENDIF
159
160#if defined key_agrif
161      if ( .NOT. Agrif_Root() ) then
162         clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname_c)
163      endif
164#endif 
165
166       ! open CLIO file
167       CALL flinopen(clname_c,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj &
168          ,ipk,zlon,zlat,zlev,itime,istep_c,zdate0,rdt,numfl2)
169       
170       IF( itime /= jpmois ) THEN
171          IF(lwp) THEN
172             WRITE(numout,*) ' '
173             WRITE(numout,*) 'problem with time coordinates '
174             WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois
175             WRITE(numout,*) ' Check in file', clname_c
176          ENDIF
177          STOP 'flx_bulk_daily.h90'
178       ENDIF
179       IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN
180          IF(lwp) THEN
181             WRITE(numout,*) ' '
182             WRITE(numout,*) 'problem with dimensions'
183             WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
184             WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
185             WRITE(numout,*) ' ipk ',ipk,' =? 1'
186             WRITE(numout,*) ' Check in file', clname_c
187          ENDIF
188          STOP 'flx_bulk_daily.h90'
189       ENDIF
190
191#if defined key_agrif
192      if ( .NOT. Agrif_Root() ) then
193         clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname_x)
194      endif
195#endif 
196       
197       ! open CMAP FILE
198       CALL flinopen(clname_x,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj &
199          ,ipk,zlon,zlat,zlev,itime,istep_x,zdate0,rdt,numfl3)
200
201       IF( itime /= jpmois ) THEN
202          IF(lwp) THEN
203             WRITE(numout,*) ' '
204             WRITE(numout,*) 'problem with time coordinates '
205             WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois
206             WRITE(numout,*) ' Check in file', clname_x
207          ENDIF
208          STOP 'flx_bulk_daily.h90'
209       ENDIF
210       IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN
211          IF(lwp) THEN
212             WRITE(numout,*) ' '
213             WRITE(numout,*) 'problem with dimensions'
214             WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
215             WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
216             WRITE(numout,*) ' ipk ',ipk,' =? 1'
217             WRITE(numout,*) ' Check in file', clname_x
218          ENDIF
219          STOP 'flx_bulk_daily.h90'
220       ENDIF
221
222#if defined key_agrif
223      if ( .NOT. Agrif_Root() ) then
224         clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname_w)
225      endif
226#endif 
227
228       ! open ERS-NCEP file
229       CALL flinopen(clname_w,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj &
230             ,ipk,zlon,zlat,zlev,itime,istep_n,zdate0,rdt,numfl4)
231
232       IF( itime /= jpday .AND. itime /= jpday+1 ) THEN
233          IF(lwp) THEN
234             WRITE(numout,*) ' '
235             WRITE(numout,*) 'problem with time coordinates '
236             WRITE(numout,*) ' itime ',itime,' jpday ',jpday
237             WRITE(numout,*) ' Check in file', clname_w
238          ENDIF
239          STOP 'flx_bulk_daily.h90'
240       ENDIF
241       IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN
242          IF(lwp) THEN
243             WRITE(numout,*) ' '
244             WRITE(numout,*) 'problem with dimensions'
245             WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
246             WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
247             WRITE(numout,*) ' ipk ',ipk,' =? 1'
248             WRITE(numout,*) ' Check in file', clname_w
249          ENDIF
250          STOP 'flx_bulk_daily.h90'
251       ENDIF
252
253    ENDIF
254
255
256    ! 2. Read daily DATA Temperature from NCEP
257    ! ---------------------------------------
258
259    IF( ndayflx /= nday ) THEN
260
261       ndayflx = nday
262       iday    = nday_year
263
264       ! read T 2m (Caution in K)
265       CALL flinget(numfl1,'air',jpidta,jpjdta,1,jpday,iday, &
266          iday,mig(1),nlci,mjg(1),nlcj,tatm(1:nlci,1:nlcj))
267
268       IF(lwp) WRITE (numout,*)' Lecture daily flx record OK :',iday
269       IF(lwp) WRITE (numout,*)' '
270
271       ! conversion of temperature Kelvin --> Celsius  [rt0=273.15]
272       tatm(:,:) = ( tatm(:,:) - rt0 )
273
274       ! read wind speed
275       CALL flinget(numfl4,'wspd',jpidta,jpjdta,1,jpday,iday, &
276          iday,mig(1),nlci,mjg(1),nlcj,vatm(1:nlci,1:nlcj))
277
278       IF(lwp) WRITE (numout,*)' Lecture daily wind speed flx :',iday
279       IF(lwp) WRITE (numout,*)' '
280
281       ! Extra-halo initialization in MPP
282       IF( lk_mpp ) THEN
283          DO ji = nlci+1, jpi
284             tatm(ji,:) = tatm(1,:)
285             vatm(ji,:) = vatm(1,:)
286          ENDDO
287          DO jj = nlcj+1, jpj
288             tatm(:,jj) = tatm(:,1)
289             vatm(:,jj) = vatm(:,1)
290          ENDDO
291       ENDIF
292         
293    ENDIF
294
295
296    !  3. Read monthly data from CLIO and From Xie
297    !  -------------------------------------------
298
299      IF( kt == nit000 .OR. imois /= nflx1 ) THEN
300
301         ! calendar computation
302
303         ! nflx1 number of the first file record used in the simulation
304         ! flx2 number of the last  file record
305
306         nflx1 = imois
307         nflx2 = nflx1+1
308         nflx1 = MOD(nflx1,iman)
309         IF ( nflx1 == 0 ) nflx1 = iman
310         nflx2 = MOD(nflx2,iman)
311         IF ( nflx2 == 0 ) nflx2 = iman
312         IF(lwp)WRITE(numout,*) 'first record file used nflx1 ',nflx1
313         IF(lwp)WRITE(numout,*) 'last  record file used nflx2 ',nflx2
314
315         ! Read monthly fluxes data Esbensen Kushnir
316
317         ! humidity
318         CALL flinget(numfl2,'socliohu',jpidta,jpjdta,jpk,jpmois,nflx1, &
319            nflx1,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,1,1))
320         CALL flinget(numfl2,'socliohu',jpidta,jpjdta,jpk,jpmois,nflx2, &
321            nflx2,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,2,1))
322
323         ! clouds
324         CALL flinget(numfl2,'socliocl',jpidta,jpjdta,jpk,jpmois,nflx1, &
325            nflx1,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,1,2))
326         CALL flinget(numfl2,'socliocl',jpidta,jpjdta,jpk,jpmois,nflx2, &
327            nflx2,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,2,2))
328
329         ! Read monthly precipitations ds flxdta(:,:,1 ou 2,4)
330
331         CALL flinget(numfl3,'rain',jpidta,jpjdta,jpk,jpmois,nflx1, &
332            nflx1,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,1,3))
333         CALL flinget(numfl3,'rain',jpidta,jpjdta,jpk,jpmois,nflx2, &
334            nflx2,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,2,3))
335
336         ! Extra-halo initialization in MPP
337         IF( lk_mpp ) THEN
338            DO ji = nlci+1, jpi
339               flxdta(ji,:,1,1) = flxdta(1,:,1,1)   ;   flxdta(ji,:,2,1) = flxdta(1,:,2,1)
340               flxdta(ji,:,1,2) = flxdta(1,:,1,2)   ;   flxdta(ji,:,2,2) = flxdta(1,:,2,2)
341               flxdta(ji,:,1,3) = flxdta(1,:,1,3)   ;   flxdta(ji,:,2,3) = flxdta(1,:,2,3)
342            ENDDO
343            DO jj = nlcj+1, jpj
344               flxdta(:,jj,1,1) = flxdta(:,1,1,1)   ;   flxdta(:,jj,2,1) = flxdta(:,1,2,1)
345               flxdta(:,jj,1,2) = flxdta(:,1,1,2)   ;   flxdta(:,jj,2,2) = flxdta(:,1,2,2)
346               flxdta(:,jj,1,3) = flxdta(:,1,1,3)   ;   flxdta(:,jj,2,3) = flxdta(:,1,2,3)
347            ENDDO
348         ENDIF
349                 
350      ENDIF
351
352
353      ! 3. at every time step linear interpolation of precipitation fluxes
354      ! -----------------------------------------------------------
355     
356      zxy = FLOAT(nday) / FLOAT(nobis(nflx1)) + 0.5 - i15
357
358      hatm(:,:) = ( (1.-zxy) * flxdta(:,:,1,1) + zxy  * flxdta(:,:,2,1) )
359      catm(:,:) = ( (1.-zxy )* flxdta(:,:,1,2) + zxy  * flxdta(:,:,2,2) ) 
360      watm(:,:) = ( (1.-zxy) * flxdta(:,:,1,3) + zxy  * flxdta(:,:,2,3) )
361
362      ! 4. Closing all files
363      ! --------------------
364
365      IF( kt == nitend ) THEN
366         CALL flinclo(numfl1)
367         CALL flinclo(numfl2)
368         CALL flinclo(numfl3)
369      ENDIF
370
371      CALL blk(kt)
372     
373      CALL FLUSH(numout)
374     
375   END SUBROUTINE flx
376   
Note: See TracBrowser for help on using the repository browser.