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.
obcdta.F90 in branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/OPA_SRC/OBC – NEMO

source: branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/OPA_SRC/OBC/obcdta.F90 @ 2636

Last change on this file since 2636 was 2627, checked in by gm, 13 years ago

dynamic mem: #785 ; OPA_SRC compilation without mpp

  • Property svn:keywords set to Id
File size: 60.1 KB
Line 
1MODULE obcdta
2   !!==============================================================================
3   !!                            ***  MODULE obcdta  ***
4   !! Open boundary data : read the data for the open boundaries.
5   !!==============================================================================
6#if defined key_obc
7   !!------------------------------------------------------------------------------
8   !!   'key_obc'         :                                Open Boundary Conditions
9   !!------------------------------------------------------------------------------
10   !!   obc_dta           : read u, v, t, s data along each open boundary
11   !!------------------------------------------------------------------------------
12   USE oce             ! ocean dynamics and tracers
13   USE dom_oce         ! ocean space and time domain
14   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
15   USE phycst          ! physical constants
16   USE obc_par         ! ocean open boundary conditions
17   USE obc_oce         ! ocean open boundary conditions
18   USE in_out_manager  ! I/O logical units
19   USE lib_mpp         ! distributed memory computing
20   USE dynspg_oce      ! ocean: surface pressure gradient
21   USE ioipsl          ! now only for  ymds2ju function
22   USE iom             !
23
24   IMPLICIT NONE
25   PRIVATE
26
27   PUBLIC   obc_dta      ! routines called by step.F90
28   PUBLIC   obc_dta_bt   ! routines called by dynspg_ts.F90
29   PUBLIC   obc_dta_alloc
30   
31
32   REAL(wp),  DIMENSION(2)              ::   zjcnes_obc   !
33   REAL(wp),  DIMENSION(:), ALLOCATABLE ::   ztcobc
34   REAL(wp) :: rdt_obc
35   REAL(wp) :: zjcnes
36   INTEGER :: imm0, iyy0, idd0, iyy, imm, idd
37   INTEGER :: nt_a=2, nt_b=1, itobc, ndate0_cnes, nday_year0
38   INTEGER ::  itobce, itobcw, itobcs, itobcn, itobc_b  ! number of time steps in OBC files
39
40   INTEGER ::   ntobc        ! where we are in the obc file
41   INTEGER ::   ntobc_b      ! first record used
42   INTEGER ::   ntobc_a      ! second record used
43
44   CHARACTER (len=40) ::   cl_obc_eTS, cl_obc_eU   ! name of data files
45   CHARACTER (len=40) ::   cl_obc_wTS, cl_obc_wU   !   -       -
46   CHARACTER (len=40) ::   cl_obc_nTS, cl_obc_nV   !   -       -
47   CHARACTER (len=40) ::   cl_obc_sTS, cl_obc_sV   !   -       -
48
49# if defined key_dynspg_ts
50   ! bt arrays for interpolating time dependent data on the boundaries
51   INTEGER ::   nt_m=0, ntobc_m
52   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ubtedta, vbtedta, sshedta       ! East
53   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ubtwdta, vbtwdta, sshwdta ! West
54   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ubtndta, vbtndta, sshndta ! North
55   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ubtsdta, vbtsdta, sshsdta ! South
56   ! arrays used for interpolating time dependent data on the boundaries
57   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: uedta, vedta, tedta, sedta    ! East
58   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: uwdta, vwdta, twdta, swdta    ! West
59   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: undta, vndta, tndta, sndta    ! North
60   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: usdta, vsdta, tsdta, ssdta    ! South
61# else
62   ! bt arrays for interpolating time dependent data on the boundaries
63   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ubtedta, vbtedta, sshedta        ! East
64   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ubtwdta, vbtwdta, sshwdta        ! West
65   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ubtndta, vbtndta, sshndta        ! North
66   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ubtsdta, vbtsdta, sshsdta        ! South
67   ! arrays used for interpolating time dependent data on the boundaries
68   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: uedta, vedta, tedta, sedta    ! East
69   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: uwdta, vwdta, twdta, swdta    ! West
70   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: undta, vndta, tndta, sndta    ! North
71   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: usdta, vsdta, tsdta, ssdta    ! South
72# endif
73   ! Masks set to .TRUE. after successful allocation below
74   LOGICAL , ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ltemsk, luemsk, lvemsk  ! boolean msks
75   LOGICAL , ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ltwmsk, luwmsk, lvwmsk  ! used for outliers
76   LOGICAL , ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ltnmsk, lunmsk, lvnmsk  ! checks
77   LOGICAL , ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ltsmsk, lusmsk, lvsmsk
78
79   !! * Substitutions
80#  include "obc_vectopt_loop_substitute.h90"
81#  include "domzgr_substitute.h90"
82   !!----------------------------------------------------------------------
83   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
84   !! $Id$
85   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
86   !!----------------------------------------------------------------------
87CONTAINS
88
89   FUNCTION obc_dta_alloc()
90      !!-------------------------------------------------------------------
91      !!                     ***  ROUTINE obc_dta_alloc  ***
92      !!                   
93      !!-------------------------------------------------------------------
94      IMPLICIT none
95      INTEGER :: obc_dta_alloc
96      INTEGER :: ierr(2)
97      !!-------------------------------------------------------------------
98
99# if defined key_dynspg_ts
100      ALLOCATE(ubtedta(jpj,0:jptobc), vbtedta(jpj,0:jptobc), &
101               sshedta(jpj,0:jptobc), ubtwdta(jpj,0:jptobc), &
102               vbtwdta(jpj,0:jptobc), sshwdta(jpj,0:jptobc), &
103               ubtndta(jpi,0:jptobc), vbtndta(jpi,0:jptobc), &
104               sshndta(jpi,0:jptobc), ubtsdta(jpi,0:jptobc), &
105               vbtsdta(jpi,0:jptobc), sshsdta(jpi,0:jptobc), &
106               ! arrays used for interpolating time dependent data on the boundaries
107               uedta(jpj,jpk,0:jptobc), vedta(jpj,jpk,0:jptobc), &
108               tedta(jpj,jpk,0:jptobc), sedta(jpj,jpk,0:jptobc), &
109               uwdta(jpj,jpk,0:jptobc), vwdta(jpj,jpk,0:jptobc), &
110               twdta(jpj,jpk,0:jptobc), swdta(jpj,jpk,0:jptobc), &
111               undta(jpi,jpk,0:jptobc), vndta(jpi,jpk,0:jptobc), &
112               tndta(jpi,jpk,0:jptobc), sndta(jpi,jpk,0:jptobc), &
113               usdta(jpi,jpk,0:jptobc), vsdta(jpi,jpk,0:jptobc), &
114               tsdta(jpi,jpk,0:jptobc), ssdta(jpi,jpk,0:jptobc), Stat=ierr(1) )
115# else
116               ! bt arrays for interpolating time dependent data on the boundaries
117      ALLOCATE(ubtedta(jpj,jptobc), vbtedta(jpj,jptobc), sshedta(jpj,jptobc), &
118               ubtwdta(jpj,jptobc), vbtwdta(jpj,jptobc), sshwdta(jpj,jptobc), &
119               ubtndta(jpi,jptobc), vbtndta(jpi,jptobc), sshndta(jpi,jptobc), &
120               ubtsdta(jpi,jptobc), vbtsdta(jpi,jptobc), sshsdta(jpi,jptobc), &
121               ! arrays used for interpolating time dependent data on the boundaries
122               uedta(jpj,jpk,jptobc), vedta(jpj,jpk,jptobc),  &
123               tedta(jpj,jpk,jptobc), sedta(jpj,jpk,jptobc),  &
124               uwdta(jpj,jpk,jptobc), vwdta(jpj,jpk,jptobc),  &
125               twdta(jpj,jpk,jptobc), swdta(jpj,jpk,jptobc),  &
126               undta(jpi,jpk,jptobc), vndta(jpi,jpk,jptobc),  &
127               tndta(jpi,jpk,jptobc), sndta(jpi,jpk,jptobc),  &
128               usdta(jpi,jpk,jptobc), vsdta(jpi,jpk,jptobc),  &
129               tsdta(jpi,jpk,jptobc), ssdta(jpi,jpk,jptobc), Stat=ierr(1) )
130# endif
131
132      ALLOCATE(uedta(jpj,jpk,jptobc), vedta(jpj,jpk,jptobc), &
133               tedta(jpj,jpk,jptobc), sedta(jpj,jpk,jptobc), &
134               uwdta(jpj,jpk,jptobc), vwdta(jpj,jpk,jptobc), &
135               twdta(jpj,jpk,jptobc), swdta(jpj,jpk,jptobc), &
136               undta(jpj,jpk,jptobc), vndta(jpj,jpk,jptobc), &
137               tndta(jpj,jpk,jptobc), sndta(jpj,jpk,jptobc), &
138               usdta(jpj,jpk,jptobc), vsdta(jpj,jpk,jptobc), &
139               tsdta(jpj,jpk,jptobc), ssdta(jpj,jpk,jptobc), &
140               ltemsk(jpj,jpk), luemsk(jpj,jpk), lvemsk(jpj,jpk), &
141               ltwmsk(jpj,jpk), luwmsk(jpj,jpk), lvwmsk(jpj,jpk), &
142               ltnmsk(jpj,jpk), lunmsk(jpj,jpk), lvnmsk(jpj,jpk), &
143               ltsmsk(jpj,jpk), lusmsk(jpj,jpk), lvsmsk(jpj,jpk), &
144               Stat=ierr(2))
145
146      obc_dta_alloc = MAXVAL(ierr)
147
148      IF(obc_dta_alloc == 0)THEN
149         ! Initialise mask values following successful allocation
150         ltemsk(:,:)=.TRUE.
151         luemsk(:,:)=.TRUE.
152         lvemsk(:,:)=.TRUE.
153         ltwmsk(:,:)=.TRUE.
154         luwmsk(:,:)=.TRUE.
155         lvwmsk(:,:)=.TRUE.
156         ltnmsk(:,:)=.TRUE.
157         lunmsk(:,:)=.TRUE.
158         lvnmsk(:,:)=.TRUE.
159         ltsmsk(:,:)=.TRUE.
160         lusmsk(:,:)=.TRUE.
161         lvsmsk(:,:)=.TRUE.
162      END IF
163
164   END FUNCTION obc_dta_alloc
165
166
167   SUBROUTINE obc_dta( kt )
168      !!---------------------------------------------------------------------------
169      !!                      ***  SUBROUTINE obc_dta  ***
170      !!                   
171      !! ** Purpose :   Find the climatological  boundary arrays for the specified date,
172      !!                The boundary arrays are netcdf files. Three possible cases:
173      !!                - one time frame only in the file (time dimension = 1).
174      !!                in that case the boundary data does not change in time.
175      !!                - many time frames. In that case,  if we have 12 frames
176      !!                we assume monthly fields.
177      !!                Else, we assume that time_counter is in seconds
178      !!                since the beginning of either the current year or a reference
179      !!                year given in the namelist.
180      !!                (no check is done so far but one would have to check the "unit"
181      !!                 attribute of variable time_counter).
182      !!
183      !!
184      !! History :
185      !!        !  98-05 (J.M. Molines) Original code
186      !!   8.5  !  02-10 (C. Talandier, A-M. Treguier) Free surface, F90
187      !!
188      !!   9.0  !  04-06 (F. Durand, A-M. Treguier) Netcdf BC files on input
189      !!        !  2007-2008 (C. Langlais, P. Mathiot, J.M. Molines) high frequency boundaries data
190      !!---------------------------------------------------------------------------
191      !! * Arguments
192      INTEGER, INTENT( in ) ::   kt          ! ocean time-step index
193
194      !! * Local declarations
195      INTEGER, SAVE :: immfile, iyyfile                     !
196      INTEGER :: nt              !  record indices (incrementation)
197      REAL(wp) ::   zsec, zxy, znum, zden ! time interpolation weight
198
199      !!---------------------------------------------------------------------------
200
201      ! 0.  initialisation :
202      ! --------------------
203      IF ( kt == nit000  )  CALL obc_dta_ini ( kt )
204      IF ( nobc_dta == 0 )  RETURN   ! already done in obc_dta_ini
205      IF ( itobc == 1    )  RETURN   ! case of only one time frame in file done in obc_dta_ini
206
207      ! in the following code, we assume that obc data are read from files, with more than 1 time frame in it
208
209      iyyfile=iyy ; immfile = 00  ! set component of the current file name
210      IF ( cffile /= 'annual') immfile = imm   !
211      IF ( ln_obc_clim       ) iyyfile = 0000  ! assume that climatological files are labeled y0000
212
213      ! 1. Synchronize time of run with time of data files
214      !---------------------------------------------------
215      ! nday_year is the day number in the current year ( 1 for 01/01 )
216      zsec=MOD( (kt-nit000)*rdt - (nday_year - nday_year0 )*rday, rday ) ! number of seconds in the current day
217      IF (ln_obc_clim)  THEN
218         zjcnes = nday_year - 1  + zsec/rday
219      ELSE
220         zjcnes = zjcnes + rdt/rday
221      ENDIF
222
223      ! look for 'before' record number in the current file
224      ntobc = nrecbef ()  ! this function return the record number for 'before', relative to zjcnes
225
226      IF (MOD(kt-1,10)==0) THEN
227         IF (lwp) WRITE(numout,*) 'kt= ',kt,' zjcnes =', zjcnes,' ndastp =',ndastp, 'mm =',imm 
228      END IF
229
230      ! 2. read a new data if necessary
231      !--------------------------------
232      IF ( ntobc /= ntobc_b ) THEN
233         ! we need to read the 'after' record
234         ! swap working index:
235# if defined key_dynspg_ts
236         nt=nt_m ; nt_m=nt_b ; nt_b=nt
237# endif
238         nt=nt_b ; nt_b=nt_a ; nt_a=nt
239         ntobc_b = ntobc
240
241         ! new record number :
242         ntobc_a = ntobc_a + 1 
243
244         ! all tricky things related to record number, changing files etc... are managed by obc_read
245
246         CALL obc_read (kt, nt_a, ntobc_a, iyyfile, immfile )
247
248         ! update zjcnes_obc
249# if defined key_dynspg_ts
250         ntobc_m=mod(ntobc_b-2+itobc,itobc)+1
251         zjcnes_obc(nt_m)= ztcobc(ntobc_m)
252# endif
253         zjcnes_obc(nt_b)= ztcobc(ntobc_b)
254         zjcnes_obc(nt_a)= ztcobc(ntobc_a)
255      ENDIF
256
257      ! 3.   interpolation at each time step
258      ! ------------------------------------
259      IF( ln_obc_clim) THEN
260         znum= MOD(zjcnes           - zjcnes_obc(nt_b), REAL(nyear_len(1),wp) )
261         IF( znum < 0 ) znum = znum + REAL(nyear_len(1),wp)
262         zden= MOD(zjcnes_obc(nt_a) - zjcnes_obc(nt_b), REAL(nyear_len(1),wp) ) 
263         IF( zden < 0 ) zden = zden + REAL(nyear_len(1),wp)
264      ELSE
265         znum= zjcnes           - zjcnes_obc(nt_b)
266         zden= zjcnes_obc(nt_a) - zjcnes_obc(nt_b)
267      ENDIF
268      zxy = znum / zden
269
270      IF( lp_obc_east ) THEN
271         !  fills sfoe, tfoe, ufoe ,vfoe
272         sfoe(:,:) = zxy * sedta (:,:,nt_a) + (1. - zxy)*sedta(:,:,nt_b)
273         tfoe(:,:) = zxy * tedta (:,:,nt_a) + (1. - zxy)*tedta(:,:,nt_b)
274         ufoe(:,:) = zxy * uedta (:,:,nt_a) + (1. - zxy)*uedta(:,:,nt_b)
275         vfoe(:,:) = zxy * vedta (:,:,nt_a) + (1. - zxy)*vedta(:,:,nt_b)
276      ENDIF
277
278      IF( lp_obc_west) THEN
279         !  fills sfow, tfow, ufow ,vfow
280         sfow(:,:) = zxy * swdta (:,:,nt_a) + (1. - zxy)*swdta(:,:,nt_b)
281         tfow(:,:) = zxy * twdta (:,:,nt_a) + (1. - zxy)*twdta(:,:,nt_b)
282         ufow(:,:) = zxy * uwdta (:,:,nt_a) + (1. - zxy)*uwdta(:,:,nt_b)
283         vfow(:,:) = zxy * vwdta (:,:,nt_a) + (1. - zxy)*vwdta(:,:,nt_b)
284      ENDIF
285
286      IF( lp_obc_north) THEN
287         !  fills sfon, tfon, ufon ,vfon
288         sfon(:,:) = zxy * sndta (:,:,nt_a) + (1. - zxy)*sndta(:,:,nt_b)
289         tfon(:,:) = zxy * tndta (:,:,nt_a) + (1. - zxy)*tndta(:,:,nt_b)
290         ufon(:,:) = zxy * undta (:,:,nt_a) + (1. - zxy)*undta(:,:,nt_b)
291         vfon(:,:) = zxy * vndta (:,:,nt_a) + (1. - zxy)*vndta(:,:,nt_b)
292      ENDIF
293
294      IF( lp_obc_south) THEN
295         !  fills sfos, tfos, ufos ,vfos
296         sfos(:,:) = zxy * ssdta (:,:,nt_a) + (1. - zxy)*ssdta(:,:,nt_b)
297         tfos(:,:) = zxy * tsdta (:,:,nt_a) + (1. - zxy)*tsdta(:,:,nt_b)
298         ufos(:,:) = zxy * usdta (:,:,nt_a) + (1. - zxy)*usdta(:,:,nt_b)
299         vfos(:,:) = zxy * vsdta (:,:,nt_a) + (1. - zxy)*vsdta(:,:,nt_b)
300      ENDIF
301   END SUBROUTINE obc_dta
302
303
304   SUBROUTINE obc_dta_ini (kt)
305      !!-----------------------------------------------------------------------------
306      !!                       ***  SUBROUTINE obc_dta_ini  ***
307      !!
308      !! ** Purpose :
309      !!      When obc_dta first call, realize some data initialization
310      !!
311      !! ** Method :
312      !!
313      !! History :
314      !!   9.0  ! 07-10 (J.M. Molines )
315      !!----------------------------------------------------------------------------
316      !! * Argument
317      INTEGER, INTENT(in)  :: kt      ! ocean time-step index
318
319      !! * Local declarations
320      INTEGER ::   ji, jj   ! dummy loop indices
321      INTEGER, SAVE :: immfile, iyyfile                     !
322
323      ! variables for the julian day calculation
324      INTEGER :: iyear, imonth, iday
325      REAL(wp) :: zsec , zjulian, zjuliancnes   
326
327      IF(lwp) WRITE(numout,*)
328      IF(lwp) WRITE(numout,*)  'obc_dta : find boundary data'
329      IF(lwp) WRITE(numout,*)  '~~~~~~~'
330      IF (lwp) THEN
331         IF ( nobc_dta == 0 ) THEN
332            WRITE(numout,*)  '          OBC data taken from initial conditions.'
333         ELSE     
334            WRITE(numout,*)  '          OBC data taken from netcdf files.'
335         ENDIF
336      ENDIF
337      nday_year0 = nday_year  ! to remember the day when kt=nit000
338
339      sedta(:,:,:) = 0.e0 ; tedta(:,:,:) = 0.e0 ; uedta(:,:,:) = 0.e0 ; vedta(:,:,:) = 0.e0 ! East
340      swdta(:,:,:) = 0.e0 ; twdta(:,:,:) = 0.e0 ; uwdta(:,:,:) = 0.e0 ; vwdta(:,:,:) = 0.e0 ! West
341      sndta(:,:,:) = 0.e0 ; tndta(:,:,:) = 0.e0 ; undta(:,:,:) = 0.e0 ; vndta(:,:,:) = 0.e0 ! North
342      ssdta(:,:,:) = 0.e0 ; tsdta(:,:,:) = 0.e0 ; usdta(:,:,:) = 0.e0 ; vsdta(:,:,:) = 0.e0 ! South
343
344      sfoe(:,:) = 0.e0  ; tfoe(:,:) = 0.e0 ; ufoe(:,:) = 0.e0 ; vfoe(:,:) = 0.e0   ! East
345      sfow(:,:) = 0.e0  ; tfow(:,:) = 0.e0 ; ufow(:,:) = 0.e0 ; vfow(:,:) = 0.e0   ! West
346      sfon(:,:) = 0.e0  ; tfon(:,:) = 0.e0 ; ufon(:,:) = 0.e0 ; vfon(:,:) = 0.e0   ! North
347      sfos(:,:) = 0.e0  ; tfos(:,:) = 0.e0 ; ufos(:,:) = 0.e0 ; vfos(:,:) = 0.e0   ! South
348
349      IF (nobc_dta == 0 ) THEN   ! boundary data are the initial data of this run (set only at nit000)
350         IF (lp_obc_east) THEN  ! East
351            DO ji = nie0 , nie1   
352               sfoe(nje0:nje1,:) = temsk(nje0:nje1,:) * sn (ji+1 , nje0:nje1 , :) * tmask(ji+1,nje0:nje1 , :)
353               tfoe(nje0:nje1,:) = temsk(nje0:nje1,:) * tn (ji+1 , nje0:nje1 , :) * tmask(ji+1,nje0:nje1 , :)
354               ufoe(nje0:nje1,:) = uemsk(nje0:nje1,:) * un (ji   , nje0:nje1 , :) * umask(ji,  nje0:nje1 , :)
355               vfoe(nje0:nje1,:) = vemsk(nje0:nje1,:) * vn (ji+1 , nje0:nje1 , :) * vmask(ji+1,nje0:nje1 , :)
356            END DO
357         ENDIF
358
359         IF (lp_obc_west) THEN  ! West
360            DO ji = niw0 , niw1   
361               sfow(njw0:njw1,:) = twmsk(njw0:njw1,:) * sn (ji , njw0:njw1 , :) * tmask(ji , njw0:njw1 , :)
362               tfow(njw0:njw1,:) = twmsk(njw0:njw1,:) * tn (ji , njw0:njw1 , :) * tmask(ji , njw0:njw1 , :)
363               ufow(njw0:njw1,:) = uwmsk(njw0:njw1,:) * un (ji , njw0:njw1 , :) * umask(ji , njw0:njw1 , :)
364               vfow(njw0:njw1,:) = vwmsk(njw0:njw1,:) * vn (ji , njw0:njw1 , :) * vmask(ji , njw0:njw1 , :)
365            END DO
366         ENDIF
367
368         IF (lp_obc_north) THEN ! North
369            DO jj = njn0 , njn1
370               sfon(nin0:nin1,:) = tnmsk(nin0:nin1,:) * sn (nin0:nin1 , jj+1 , :) * tmask(nin0:nin1 , jj+1 , :)
371               tfon(nin0:nin1,:) = tnmsk(nin0:nin1,:) * tn (nin0:nin1 , jj+1 , :) * tmask(nin0:nin1 , jj+1 , :)
372               ufon(nin0:nin1,:) = unmsk(nin0:nin1,:) * un (nin0:nin1 , jj+1 , :) * umask(nin0:nin1 , jj+1 , :)
373               vfon(nin0:nin1,:) = vnmsk(nin0:nin1,:) * vn (nin0:nin1 , jj   , :) * vmask(nin0:nin1 , jj   , :)
374            END DO
375         ENDIF
376
377         IF (lp_obc_south) THEN ! South
378            DO jj = njs0 , njs1
379               sfos(nis0:nis1,:) = tsmsk(nis0:nis1,:) * sn (nis0:nis1 , jj , :) * tmask(nis0:nis1 , jj , :)
380               tfos(nis0:nis1,:) = tsmsk(nis0:nis1,:) * tn (nis0:nis1 , jj , :) * tmask(nis0:nis1 , jj , :)
381               ufos(nis0:nis1,:) = usmsk(nis0:nis1,:) * un (nis0:nis1 , jj , :) * umask(nis0:nis1 , jj , :)
382               vfos(nis0:nis1,:) = vsmsk(nis0:nis1,:) * vn (nis0:nis1 , jj , :) * vmask(nis0:nis1 , jj , :)
383            END DO
384         ENDIF
385         RETURN  ! exit the routine all is done
386      ENDIF  ! nobc_dta = 0
387
388!!!! In the following OBC data are read from files.
389      ! all logical-mask are initialzed to true when declared
390      WHERE ( temsk == 0 ) ltemsk=.FALSE. 
391      WHERE ( uemsk == 0 ) luemsk=.FALSE. 
392      WHERE ( vemsk == 0 ) lvemsk=.FALSE. 
393
394      WHERE ( twmsk == 0 ) ltwmsk=.FALSE. 
395      WHERE ( uwmsk == 0 ) luwmsk=.FALSE. 
396      WHERE ( vwmsk == 0 ) lvwmsk=.FALSE. 
397
398      WHERE ( tnmsk == 0 ) ltnmsk=.FALSE. 
399      WHERE ( unmsk == 0 ) lunmsk=.FALSE. 
400      WHERE ( vnmsk == 0 ) lvnmsk=.FALSE. 
401
402      WHERE ( tsmsk == 0 ) ltsmsk=.FALSE. 
403      WHERE ( usmsk == 0 ) lusmsk=.FALSE. 
404      WHERE ( vsmsk == 0 ) lvsmsk=.FALSE. 
405
406      iyear=1950;  imonth=01; iday=01;  zsec=0. 
407      ! zjuliancnes : julian day corresonding  to  01/01/1950
408      CALL ymds2ju(iyear, imonth, iday,zsec , zjuliancnes)
409
410      !current year and curent month
411      iyy=INT(ndastp/10000) ; imm=INT((ndastp -iyy*10000)/100) ; idd=(ndastp-iyy*10000-imm*100)
412      IF (iyy <  1900)  iyy = iyy+1900  ! always assume that years are on 4 digits.
413      CALL ymds2ju(iyy, imm, idd ,zsec , zjulian)
414      ndate0_cnes = zjulian - zjuliancnes   ! jcnes day when call to obc_dta_ini
415
416      iyyfile=iyy ; immfile=0  ! set component of the current file name
417      IF ( cffile /= 'annual') immfile=imm
418      IF ( ln_obc_clim) iyyfile = 0  ! assume that climatological files are labeled y0000
419
420      CALL obc_dta_chktime ( iyyfile, immfile )
421
422      IF ( itobc == 1 ) THEN 
423         ! in this case we will provide boundary data only once.
424         nt_a=1 ; ntobc_a=1
425         CALL obc_read (nit000, nt_a, ntobc_a, iyyfile, immfile) 
426         IF( lp_obc_east ) THEN
427            !  fills sfoe, tfoe, ufoe ,vfoe
428            sfoe(:,:) =  sedta (:,:,1) ; tfoe(:,:) =  tedta (:,:,1)
429            ufoe(:,:) =  uedta (:,:,1) ; vfoe(:,:) =  vedta (:,:,1)
430         ENDIF
431
432         IF( lp_obc_west) THEN
433            !  fills sfow, tfow, ufow ,vfow
434            sfow(:,:) =  swdta (:,:,1) ; tfow(:,:) =  twdta (:,:,1)
435            ufow(:,:) =  uwdta (:,:,1) ; vfow(:,:) =  vwdta (:,:,1)
436         ENDIF
437
438         IF( lp_obc_north) THEN
439            !  fills sfon, tfon, ufon ,vfon
440            sfon(:,:) =  sndta (:,:,1) ; tfon(:,:) =  tndta (:,:,1)
441            ufon(:,:) =  undta (:,:,1) ; vfon(:,:) =  vndta (:,:,1)
442         ENDIF
443
444         IF( lp_obc_south) THEN
445            !  fills sfos, tfos, ufos ,vfos
446            sfos(:,:) =  ssdta (:,:,1) ; tfos(:,:) =  tsdta (:,:,1)
447            ufos(:,:) =  usdta (:,:,1) ; vfos(:,:) =  vsdta (:,:,1)
448         ENDIF
449         RETURN  ! we go out of obc_dta_ini -------------------------------------->>>>>
450      ENDIF
451
452      ! nday_year is the day number in the current year ( 1 for 01/01 )
453      ! we suppose that we always start from the begining of a day
454      !    zsec=MOD( (kt-nit000)*rdt - (nday_year - nday_year0 )*rday, rday ) ! number of seconds in the current day
455      zsec=0.e0  ! here, kt=nit000, nday_year = ndat_year0
456
457      IF (ln_obc_clim)  THEN
458         zjcnes = nday_year - 1  + zsec/rday  ! for clim file time is in days in a year
459      ELSE
460         zjcnes = ndate0_cnes + (nday_year - nday_year0 ) + zsec/rday
461      ENDIF
462
463      ! look for 'before' record number in the current file
464      ntobc = nrecbef ()
465
466      IF (lwp) WRITE(numout,*) 'obc files frequency :',cffile
467      IF (lwp) WRITE(numout,*) ' zjcnes0 =',zjcnes,' ndastp0 =',ndastp
468      IF (lwp) WRITE(numout,*) ' annee0 ',iyy,' month0 ', imm,' day0 ', idd
469      IF (lwp) WRITE(numout,*) 'first file open :',cl_obc_nTS
470
471      ! record initialisation
472      !--------------------
473      nt_b = 1 ; nt_a = 2
474
475      ntobc_a = ntobc + 1
476      ntobc_b = ntobc
477
478      CALL obc_read (kt, nt_b, ntobc_b, iyyfile, immfile)  ! read 'before' fields
479      CALL obc_read (kt, nt_a, ntobc_a, iyyfile, immfile)  ! read 'after' fields
480
481      ! additional frame in case of time-splitting
482# if defined key_dynspg_ts
483      nt_m = 0
484      ntobc_m=mod(ntobc_b-2+itobc,itobc)+1
485      zjcnes_obc(nt_m)= ztcobc(ntobc_m) ! FDbug has not checked that this is correct!!
486      IF (ln_rstart) THEN
487         CALL obc_read (kt, nt_m, ntobc_m, iyyfile, immfile)  ! read 'after' fields
488      ENDIF
489# endif
490
491      zjcnes_obc(nt_b)= ztcobc(ntobc_b)
492      zjcnes_obc(nt_a)= ztcobc(ntobc_a)
493      !
494   END SUBROUTINE obc_dta_ini
495
496
497   SUBROUTINE obc_dta_chktime (kyyfile, kmmfile)
498      !
499      ! check the number of time steps in the files and read ztcobc
500      !
501      ! * Arguments
502      INTEGER, INTENT(in) :: kyyfile, kmmfile
503      ! * local variables
504      INTEGER :: istop       ! error control
505      INTEGER :: ji          ! dummy loop index
506
507      INTEGER ::  idvar, id_e, id_w, id_n, id_s       ! file identifiers
508      INTEGER, DIMENSION(1)  :: itmp
509      CHARACTER(LEN=25) :: cl_vname
510
511      ntobc_a = 0; itobce =0 ; itobcw = 0; itobcn = 0; itobcs = 0
512      ! build file name
513      IF(ln_obc_clim) THEN   ! revert to old convention for climatological OBC forcing
514         cl_obc_eTS='obceast_TS.nc'
515         cl_obc_wTS='obcwest_TS.nc'
516         cl_obc_nTS='obcnorth_TS.nc'
517         cl_obc_sTS='obcsouth_TS.nc'
518      ELSE                   ! convention for climatological OBC
519         WRITE(cl_obc_eTS ,'("obc_east_TS_y",i4.4,"m",i2.2,".nc")'  ) kyyfile,kmmfile
520         WRITE(cl_obc_wTS ,'("obc_west_TS_y",i4.4,"m",i2.2,".nc")'  ) kyyfile,kmmfile
521         WRITE(cl_obc_nTS ,'("obc_north_TS_y",i4.4,"m",i2.2,".nc")' ) kyyfile,kmmfile
522         WRITE(cl_obc_sTS ,'("obc_south_TS_y",i4.4,"m",i2.2,".nc")' ) kyyfile,kmmfile
523      ENDIF
524
525      cl_vname = 'time_counter'
526      IF ( lp_obc_east ) THEN
527         CALL iom_open ( cl_obc_eTS , id_e )
528         idvar = iom_varid( id_e, cl_vname, kdimsz = itmp ); itobce=itmp(1)
529      ENDIF
530      IF ( lp_obc_west ) THEN
531         CALL iom_open ( cl_obc_wTS , id_w )
532         idvar = iom_varid( id_w, cl_vname, kdimsz = itmp ) ; itobcw=itmp(1)
533      ENDIF
534      IF ( lp_obc_north ) THEN
535         CALL iom_open ( cl_obc_nTS , id_n )
536         idvar = iom_varid( id_n, cl_vname, kdimsz = itmp ) ; itobcn=itmp(1)
537      ENDIF
538      IF ( lp_obc_south ) THEN
539         CALL iom_open ( cl_obc_sTS , id_s )
540         idvar = iom_varid( id_s, cl_vname, kdimsz = itmp ) ; itobcs=itmp(1)
541      ENDIF
542
543      itobc = MAX( itobce, itobcw, itobcn, itobcs )
544      istop = 0
545      IF ( lp_obc_east  .AND. itobce /= itobc ) istop = istop+1 
546      IF ( lp_obc_west  .AND. itobcw /= itobc ) istop = istop+1     
547      IF ( lp_obc_north .AND. itobcn /= itobc ) istop = istop+1
548      IF ( lp_obc_south .AND. itobcs /= itobc ) istop = istop+1 
549      nstop = nstop + istop
550
551      IF ( istop /=  0 )  THEN
552         WRITE(ctmp1,*) ' east, west, north, south: ', itobce, itobcw, itobcn, itobcs
553         CALL ctl_stop( 'obcdta : all files must have the same number of time steps', ctmp1 )
554      ENDIF
555
556      IF ( itobc == 1 ) THEN
557         IF (lwp) THEN
558            WRITE(numout,*) ' obcdta found one time step only in the OBC files'
559            IF (ln_obc_clim) THEN
560               ! OK no problem
561            ELSE
562               ln_obc_clim=.true.
563               WRITE(numout,*) ' we force ln_obc_clim to T'
564            ENDIF
565         ENDIF
566      ELSE
567         IF ( ALLOCATED(ztcobc) ) DEALLOCATE ( ztcobc )
568         ALLOCATE (ztcobc(itobc))
569         DO ji=1,1   ! use a dummy loop to read ztcobc only once
570            IF ( lp_obc_east ) THEN
571               CALL iom_gettime ( id_e, ztcobc, cl_vname ) ; CALL iom_close (id_e) ; EXIT
572            ENDIF
573            IF ( lp_obc_west ) THEN
574               CALL iom_gettime ( id_w, ztcobc, cl_vname ) ; CALL iom_close (id_w) ; EXIT
575            ENDIF
576            IF ( lp_obc_north ) THEN
577               CALL iom_gettime ( id_n, ztcobc, cl_vname ) ; CALL iom_close (id_n) ; EXIT
578            ENDIF
579            IF ( lp_obc_south ) THEN
580               CALL iom_gettime ( id_s, ztcobc, cl_vname ) ; CALL iom_close (id_s) ; EXIT
581            ENDIF
582         END DO
583         rdt_obc = ztcobc(2)-ztcobc(1)  !  just an information, not used for any computation
584         IF (lwp) WRITE(numout,*) ' obcdta found', itobc,' time steps in the OBC files'
585         IF (lwp) WRITE(numout,*) ' time step of obc data :', rdt_obc,' days'           
586      ENDIF
587      zjcnes = zjcnes - rdt/rday  ! trick : zcnes is always incremented by rdt/rday in obc_dta!
588   END SUBROUTINE obc_dta_chktime
589
590# if defined key_dynspg_ts || defined key_dynspg_exp
591   SUBROUTINE obc_dta_bt( kt, kbt )
592      !!---------------------------------------------------------------------------
593      !!                      ***  SUBROUTINE obc_dta  ***
594      !!
595      !! ** Purpose :   time interpolation of barotropic data for time-splitting scheme
596      !!                Data at the boundary must be in m2/s
597      !!
598      !! History :
599      !!   9.0  !  05-11 (V. garnier) Original code
600      !!---------------------------------------------------------------------------
601      !! * Arguments
602      INTEGER, INTENT( in ) ::   kt          ! ocean time-step index
603      INTEGER, INTENT( in ) ::   kbt         ! barotropic ocean time-step index
604
605      !! * Local declarations
606      INTEGER ::   ji, jj  ! dummy loop indices
607      INTEGER ::   i15
608      INTEGER ::   itobcm, itobcp
609      REAL(wp) ::  zxy
610      INTEGER ::   isrel           ! number of seconds since 1/1/1992
611
612      !!---------------------------------------------------------------------------
613
614      ! 1.   First call: check time frames available in files.
615      ! -------------------------------------------------------
616
617      IF( kt == nit000 ) THEN
618
619         ! 1.1  Barotropic tangential velocities set to zero
620         ! -------------------------------------------------
621         IF( lp_obc_east  ) vbtfoe(:) = 0.e0
622         IF( lp_obc_west  ) vbtfow(:) = 0.e0
623         IF( lp_obc_south ) ubtfos(:) = 0.e0
624         IF( lp_obc_north ) ubtfon(:) = 0.e0
625
626         ! 1.2  Sea surface height and normal barotropic velocities set to zero
627         !                               or initial conditions if nobc_dta == 0
628         ! --------------------------------------------------------------------
629
630         IF( lp_obc_east ) THEN
631            ! initialisation to zero
632            sshedta(:,:) = 0.e0
633            ubtedta(:,:) = 0.e0
634            vbtedta(:,:) = 0.e0 ! tangential component
635            !                                        ! ================== !
636            IF( nobc_dta == 0 )   THEN               ! initial state used !
637               !                                     ! ================== !
638               !  Fills sedta, tedta, uedta (global arrays)
639               !  Remark: this works for njzoom = 1. Should the definition of ij include njzoom?
640               DO ji = nie0, nie1
641                  DO jj = 1, jpj
642                     sshedta(jj,1) = sshn(ji+1,jj) * tmask(ji+1,jj,1)
643                  END DO
644               END DO
645            ENDIF
646         ENDIF
647
648         IF( lp_obc_west) THEN
649            ! initialisation to zero
650            sshwdta(:,:) = 0.e0
651            ubtwdta(:,:) = 0.e0
652            vbtwdta(:,:) = 0.e0 ! tangential component
653            !                                        ! ================== !
654            IF( nobc_dta == 0 )   THEN               ! initial state used !
655               !                                     ! ================== !
656               !  Fills swdta, twdta, uwdta (global arrays)
657               !  Remark: this works for njzoom = 1. Should the definition of ij include njzoom?
658               DO ji = niw0, niw1
659                  DO jj = 1, jpj
660                     sshwdta(jj,1) = sshn(ji,jj) * tmask(ji,jj,1)
661                  END DO
662               END DO
663            ENDIF
664         ENDIF
665
666         IF( lp_obc_north) THEN
667            ! initialisation to zero
668            sshndta(:,:) = 0.e0
669            ubtndta(:,:) = 0.e0 ! tangential component
670            vbtndta(:,:) = 0.e0
671            !                                        ! ================== !
672            IF( nobc_dta == 0 ) THEN                 ! initial state used !
673               !                                     ! ================== !
674               !  Fills sndta, tndta, vndta (global arrays)
675               !  Remark: this works for njzoom = 1. Should the definition of ij include njzoom?
676               DO jj = njn0, njn1
677                  DO ji = 1, jpi
678                     sshndta(ji,1) = sshn(ji,jj+1) * tmask(ji,jj+1,1)
679                  END DO
680               END DO
681            ENDIF
682         ENDIF
683
684         IF( lp_obc_south) THEN
685            ! initialisation to zero
686            sshsdta(:,:) = 0.e0
687            ubtsdta(:,:) = 0.e0 ! tangential component
688            vbtsdta(:,:) = 0.e0
689            !                                        ! ================== !
690            IF( nobc_dta == 0 )   THEN               ! initial state used !
691               !                                     ! ================== !
692               !  Fills ssdta, tsdta, vsdta (global arrays)
693               !  Remark: this works for njzoom = 1. Should the definition of ij include njzoom?
694               DO jj = njs0, njs1
695                  DO ji = 1, jpi
696                     sshsdta(ji,1) = sshn(ji,jj) * tmask(ji,jj,1)
697                  END DO
698               END DO
699            ENDIF
700         ENDIF
701
702         IF( nobc_dta == 0 ) CALL obc_depth_average(1)   ! depth averaged velocity from the OBC depth-dependent frames
703
704      ENDIF        !       END kt == nit000
705
706      !!------------------------------------------------------------------------------------
707      ! 2.      Initialize the time we are at. Does this every time the routine is called,
708      !         excepted when nobc_dta = 0
709      !
710
711      ! 3.  Call at every time step : Linear interpolation of BCs to current time step
712      ! ----------------------------------------------------------------------
713
714      IF( lk_dynspg_ts ) THEN
715         isrel = (kt-1)*rdt + kbt*(rdt/REAL(nn_baro,wp))
716      ELSE IF( lk_dynspg_exp ) THEN
717         isrel=kt*rdt
718      ENDIF
719
720      itobcm = nt_b
721      itobcp = nt_a
722      IF( itobc == 1 .OR. nobc_dta == 0 ) THEN
723         zxy = 0.e0
724         itobcm = 1
725         itobcp = 1
726      ELSE IF( itobc == 12 ) THEN
727         i15   = nday / 16
728         zxy = FLOAT( nday + 15 - 30 * i15 ) / 30.
729      ELSE
730         zxy = (zjcnes_obc(nt_a)-FLOAT(isrel)) / (zjcnes_obc(nt_a)-zjcnes_obc(nt_b))
731         IF( zxy < 0. ) THEN   ! case of extrapolation, switch to old time frames
732            itobcm = nt_m
733            itobcp = nt_b
734            zxy = (zjcnes_obc(nt_b)-FLOAT(isrel)) / (zjcnes_obc(nt_b)-zjcnes_obc(nt_m))
735         ENDIF
736      ENDIF
737
738      IF( lp_obc_east ) THEN           !  fills sshfoe, ubtfoe (local to each processor)
739         DO jj = 1, jpj
740            sshfoe(jj) = zxy * sshedta(jj,itobcp) + (1.-zxy) * sshedta(jj,itobcm)
741            ubtfoe(jj) = zxy * ubtedta(jj,itobcp) + (1.-zxy) * ubtedta(jj,itobcm)
742            vbtfoe(jj) = zxy * vbtedta(jj,itobcp) + (1.-zxy) * vbtedta(jj,itobcm)
743         END DO
744      ENDIF
745
746      IF( lp_obc_west) THEN            !  fills sshfow, ubtfow (local to each processor)
747         DO jj = 1, jpj
748            sshfow(jj) = zxy * sshwdta(jj,itobcp) + (1.-zxy) * sshwdta(jj,itobcm)
749            ubtfow(jj) = zxy * ubtwdta(jj,itobcp) + (1.-zxy) * ubtwdta(jj,itobcm)
750            vbtfow(jj) = zxy * vbtwdta(jj,itobcp) + (1.-zxy) * vbtwdta(jj,itobcm)
751         END DO
752      ENDIF
753
754      IF( lp_obc_north) THEN           !  fills sshfon, vbtfon (local to each processor)
755         DO ji = 1, jpi
756            sshfon(ji) = zxy * sshndta(ji,itobcp) + (1.-zxy) * sshndta(ji,itobcm)
757            ubtfon(ji) = zxy * ubtndta(ji,itobcp) + (1.-zxy) * ubtndta(ji,itobcm)
758            vbtfon(ji) = zxy * vbtndta(ji,itobcp) + (1.-zxy) * vbtndta(ji,itobcm)
759         END DO
760      ENDIF
761
762      IF( lp_obc_south) THEN           !  fills sshfos, vbtfos (local to each processor)
763         DO ji = 1, jpi
764            sshfos(ji) = zxy * sshsdta(ji,itobcp) + (1.-zxy) * sshsdta(ji,itobcm)
765            ubtfos(ji) = zxy * ubtsdta(ji,itobcp) + (1.-zxy) * ubtsdta(ji,itobcm)
766            vbtfos(ji) = zxy * vbtsdta(ji,itobcp) + (1.-zxy) * vbtsdta(ji,itobcm)
767         END DO
768      ENDIF
769
770   END SUBROUTINE obc_dta_bt
771
772# else
773   !!-----------------------------------------------------------------------------
774   !!   Default option
775   !!-----------------------------------------------------------------------------
776   SUBROUTINE obc_dta_bt ( kt, kbt )       ! Empty routine
777      !! * Arguments
778      INTEGER,INTENT(in) :: kt
779      INTEGER, INTENT( in ) ::   kbt         ! barotropic ocean time-step index
780      WRITE(*,*) 'obc_dta_bt: You should not have seen this print! error?', kt
781      WRITE(*,*) 'obc_dta_bt: You should not have seen this print! error?', kbt
782   END SUBROUTINE obc_dta_bt
783# endif
784
785   SUBROUTINE obc_read (kt, nt_x, ntobc_x, iyy, imm)
786      !!-------------------------------------------------------------------------
787      !!                      ***  ROUTINE obc_read  ***
788      !!
789      !! ** Purpose :  Read the boundary data in files identified by iyy and imm
790      !!               According to the validated open boundaries, return the
791      !!               following arrays :
792      !!                sedta, tedta : East OBC salinity and temperature
793      !!                uedta, vedta :   "   "  u and v velocity component     
794      !!
795      !!                swdta, twdta : West OBC salinity and temperature
796      !!                uwdta, vwdta :   "   "  u and v velocity component     
797      !!
798      !!                sndta, tndta : North OBC salinity and temperature
799      !!                undta, vndta :   "   "  u and v velocity component     
800      !!
801      !!                ssdta, tsdta : South OBC salinity and temperature
802      !!                usdta, vsdta :   "   "  u and v velocity component     
803      !!
804      !! ** Method  :  These fields are read in the record ntobc_x of the files.
805      !!               The number of records is already known. If  ntobc_x is greater
806      !!               than the number of record, this routine will look for next file,
807      !!               updating the indices (case of inter-annual obcs) or loop at the
808      !!               begining in case of climatological file (ln_obc_clim = true ).
809      !! -------------------------------------------------------------------------
810      !! History:     !  2005  ( P. Mathiot, C. Langlais ) Original code
811      !!              !  2008  ( J,M, Molines ) Use IOM and cleaning
812      !!--------------------------------------------------------------------------
813
814      ! * Arguments
815      INTEGER, INTENT( in ) :: kt, nt_x
816      INTEGER, INTENT( inout ) :: ntobc_x , iyy, imm      ! yes ! inout !
817
818      ! * Local variables
819      CHARACTER (len=40) :: &    ! file names
820         cl_obc_eTS   , cl_obc_eU,  cl_obc_eV,&
821         cl_obc_wTS   , cl_obc_wU,  cl_obc_wV,&
822         cl_obc_nTS   , cl_obc_nU,  cl_obc_nV,&
823         cl_obc_sTS   , cl_obc_sU,  cl_obc_sV
824
825      INTEGER :: ikprint
826      REAL(wp) :: zmin, zmax   ! control of boundary values
827
828      !IOM stuff
829      INTEGER :: id_e, id_w, id_n, id_s
830      INTEGER, DIMENSION(2) :: istart, icount
831
832      !--------------------------------------------------------------------------
833      IF ( ntobc_x > itobc ) THEN
834         IF (ln_obc_clim) THEN  ! just loop on the same file
835            ntobc_x = 1 
836         ELSE
837            ! need to change file : it is always for an 'after' data
838            IF ( cffile == 'annual' ) THEN ! go to next year file
839               iyy = iyy + 1
840            ELSE IF ( cffile =='monthly' ) THEN  ! go to next month file
841               imm = imm + 1 
842               IF ( imm == 13 ) THEN
843                  imm = 1 ; iyy = iyy + 1
844               ENDIF
845            ELSE
846               ctmp1='obcread : this type of obc file is not supported :( '
847               ctmp2=TRIM(cffile)
848               CALL ctl_stop (ctmp1, ctmp2)
849               ! cffile should be either annual or monthly ...
850            ENDIF
851            ! as the file is changed, need to update itobc etc ...
852            CALL obc_dta_chktime (iyy,imm)
853            ntobc_x = nrecbef() + 1 ! remember : this case occur for an after data
854         ENDIF
855      ENDIF
856
857      IF( lp_obc_east ) THEN 
858         ! ... Read datafile and set temperature, salinity and normal velocity
859         ! ... initialise the sedta, tedta, uedta arrays
860         IF(ln_obc_clim) THEN  ! revert to old convention for climatological OBC forcing
861            cl_obc_eTS='obceast_TS.nc'
862            cl_obc_eU ='obceast_U.nc'
863            cl_obc_eV ='obceast_V.nc'
864         ELSE                  ! convention for climatological OBC
865            WRITE(cl_obc_eTS ,'("obc_east_TS_y"  ,i4.4,"m",i2.2,".nc")' ) iyy,imm
866            WRITE(cl_obc_eU  ,'("obc_east_U_y"   ,i4.4,"m",i2.2,".nc")' ) iyy,imm
867            WRITE(cl_obc_eV  ,'("obc_east_V_y"   ,i4.4,"m",i2.2,".nc")' ) iyy,imm
868         ENDIF
869         ! JMM this may change depending on the obc data format ...
870         istart(:)=(/nje0+njmpp-1,1/) ; icount(:)=(/nje1-nje0 +1,jpk/)
871         IF (lwp) WRITE(numout,*) 'read data in :', TRIM(cl_obc_eTS)
872         IF (nje1 >= nje0 ) THEN
873            CALL iom_open ( cl_obc_eTS , id_e )
874            CALL iom_get ( id_e, jpdom_unknown, 'votemper', tedta(nje0:nje1,:,nt_x), &
875               &               ktime=ntobc_x , kstart=istart, kcount= icount )
876            CALL iom_get ( id_e, jpdom_unknown, 'vosaline', sedta(nje0:nje1,:,nt_x), &
877               &               ktime=ntobc_x , kstart=istart, kcount= icount )
878# if defined key_dynspg_ts || defined key_dynspg_exp
879            CALL iom_get ( id_e, jpdom_unknown, 'vossurfh', sshedta(nje0:nje1,nt_x), &
880               &               ktime=ntobc_x , kstart=istart, kcount= icount )
881# endif
882            CALL iom_close (id_e)
883            !
884            CALL iom_open ( cl_obc_eU , id_e )
885            CALL iom_get  ( id_e, jpdom_unknown, 'vozocrtx', uedta(nje0:nje1,:,nt_x), &
886               &               ktime=ntobc_x , kstart=istart, kcount= icount )
887            CALL iom_close ( id_e )
888            !
889            CALL iom_open ( cl_obc_eV , id_e )
890            CALL iom_get ( id_e, jpdom_unknown, 'vomecrty', vedta(nje0:nje1,:,nt_x), &
891               &               ktime=ntobc_x , kstart=istart, kcount= icount )
892            CALL iom_close ( id_e )
893
894            ! mask the boundary values
895            tedta(:,:,nt_x) = tedta(:,:,nt_x)*temsk(:,:) ;  sedta(:,:,nt_x) = sedta(:,:,nt_x)*temsk(:,:)
896            uedta(:,:,nt_x) = uedta(:,:,nt_x)*uemsk(:,:) ;  vedta(:,:,nt_x) = vedta(:,:,nt_x)*vemsk(:,:)
897
898            ! check any outliers
899            zmin=MINVAL( sedta(:,:,nt_x), mask=ltemsk ) ; zmax=MAXVAL(sedta(:,:,nt_x), mask=ltemsk)
900            IF (  zmin < 5 .OR. zmax > 50)   THEN
901               CALL ctl_stop('Error in sedta',' routine obcdta')
902            ENDIF
903            zmin=MINVAL( tedta(:,:,nt_x), mask=ltemsk ) ; zmax=MAXVAL(tedta(:,:,nt_x), mask=ltemsk)
904            IF (  zmin < -10. .OR. zmax > 40)   THEN
905               CALL ctl_stop('Error in tedta',' routine obcdta')
906            ENDIF
907            zmin=MINVAL( uedta(:,:,nt_x), mask=luemsk ) ; zmax=MAXVAL(uedta(:,:,nt_x), mask=luemsk)
908            IF (  zmin < -5. .OR. zmax > 5.)   THEN
909               CALL ctl_stop('Error in uedta',' routine obcdta')
910            ENDIF
911            zmin=MINVAL( vedta(:,:,nt_x), mask=lvemsk ) ; zmax=MAXVAL(vedta(:,:,nt_x), mask=lvemsk)
912            IF (  zmin < -5. .OR. zmax > 5.)   THEN
913               CALL ctl_stop('Error in vedta',' routine obcdta')
914            ENDIF
915
916            !               Usually printout is done only once at kt = nit000, unless nprint (namelist) > 1     
917            IF ( lwp .AND.  ( kt == nit000 .OR. nprint /= 0 )  ) THEN
918               WRITE(numout,*)
919               WRITE(numout,*) ' Read East OBC data records ', ntobc_x
920               ikprint = jpj/20 +1
921               WRITE(numout,*) ' Temperature  record 1 - printout every 3 level'
922               CALL prihre( tedta(:,:,nt_x), jpj, jpk, 1, jpj, ikprint, jpk, 1, -3, 1., numout )
923               WRITE(numout,*)
924               WRITE(numout,*) ' Salinity  record 1 - printout every 3 level'
925               CALL prihre( sedta(:,:,nt_x), jpj, jpk, 1, jpj, ikprint, jpk, 1, -3, 1., numout )
926               WRITE(numout,*)
927               WRITE(numout,*) ' Normal velocity U  record 1  - printout every 3 level'
928               CALL prihre( uedta(:,:,nt_x), jpj, jpk, 1, jpj, ikprint, jpk, 1, -3, 1., numout )
929               WRITE(numout,*)
930               WRITE(numout,*) ' Tangential velocity V  record 1  - printout every 3 level'
931               CALL prihre( vedta(:,:,nt_x), jpj, jpk, 1, jpj, ikprint, jpk, 1, -3, 1., numout )
932            ENDIF
933         ENDIF
934      ENDIF
935!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
936      IF ( lp_obc_west ) THEN
937         ! ... Read datafile and set temperature, salinity and normal velocity
938         ! ... initialise the swdta, twdta, uwdta arrays
939         IF (ln_obc_clim) THEN   ! revert to old convention for climatological OBC forcing
940            cl_obc_wTS='obcwest_TS.nc'
941            cl_obc_wU ='obcwest_U.nc'
942            cl_obc_wV ='obcwest_V.nc'
943         ELSE                    ! convention for climatological OBC
944            WRITE(cl_obc_wTS ,'("obc_west_TS_y"  ,i4.4,"m",i2.2,".nc")' ) iyy,imm
945            WRITE(cl_obc_wU  ,'("obc_west_U_y"   ,i4.4,"m",i2.2,".nc")' ) iyy,imm
946            WRITE(cl_obc_wV  ,'("obc_west_V_y"   ,i4.4,"m",i2.2,".nc")' ) iyy,imm
947         ENDIF
948         istart(:)=(/njw0+njmpp-1,1/) ; icount(:)=(/njw1-njw0 +1,jpk/)
949         IF (lwp) WRITE(numout,*) 'read data in :', TRIM(cl_obc_wTS)
950
951         IF ( njw1 >= njw0 ) THEN
952            CALL iom_open ( cl_obc_wTS , id_w )
953            CALL iom_get ( id_w, jpdom_unknown, 'votemper', twdta(njw0:njw1,:,nt_x), & 
954               &               ktime=ntobc_x , kstart=istart, kcount= icount )
955
956            CALL iom_get ( id_w, jpdom_unknown, 'vosaline', swdta(njw0:njw1,:,nt_x), &
957               &               ktime=ntobc_x , kstart=istart, kcount= icount)
958# if defined key_dynspg_ts || defined key_dynspg_exp
959            CALL iom_get ( id_w, jpdom_unknown, 'vossurfh', sshwdta(njw0:njw1,nt_x), &
960               &               ktime=ntobc_x , kstart=istart, kcount= icount )
961# endif
962            CALL iom_close (id_w)
963            !
964            CALL iom_open ( cl_obc_wU , id_w )
965            CALL iom_get  ( id_w, jpdom_unknown, 'vozocrtx', uwdta(njw0:njw1,:,nt_x),&
966               &               ktime=ntobc_x , kstart=istart, kcount= icount )
967            CALL iom_close ( id_w )
968            !
969            CALL iom_open ( cl_obc_wV , id_w )
970            CALL iom_get ( id_w, jpdom_unknown, 'vomecrty', vwdta(njw0:njw1,:,nt_x), &
971               &               ktime=ntobc_x , kstart=istart, kcount= icount )
972            CALL iom_close ( id_w )
973
974            ! mask the boundary values
975            twdta(:,:,nt_x) = twdta(:,:,nt_x)*twmsk(:,:) ;  swdta(:,:,nt_x) = swdta(:,:,nt_x)*twmsk(:,:)
976            uwdta(:,:,nt_x) = uwdta(:,:,nt_x)*uwmsk(:,:) ;  vwdta(:,:,nt_x) = vwdta(:,:,nt_x)*vwmsk(:,:)
977
978            ! check any outliers
979            zmin=MINVAL( swdta(:,:,nt_x), mask=ltwmsk ) ; zmax=MAXVAL(swdta(:,:,nt_x), mask=ltwmsk)
980            IF (  zmin < 5 .OR. zmax > 50)   THEN
981               CALL ctl_stop('Error in swdta',' routine obcdta')
982            ENDIF
983            zmin=MINVAL( twdta(:,:,nt_x), mask=ltwmsk ) ; zmax=MAXVAL(twdta(:,:,nt_x), mask=ltwmsk)
984            IF (  zmin < -10. .OR. zmax > 40)   THEN
985               CALL ctl_stop('Error in twdta',' routine obcdta')
986            ENDIF
987            zmin=MINVAL( uwdta(:,:,nt_x), mask=luwmsk ) ; zmax=MAXVAL(uwdta(:,:,nt_x), mask=luwmsk)
988            IF (  zmin < -5. .OR. zmax > 5.)   THEN
989               CALL ctl_stop('Error in uwdta',' routine obcdta')
990            ENDIF
991            zmin=MINVAL( vwdta(:,:,nt_x), mask=lvwmsk ) ; zmax=MAXVAL(vwdta(:,:,nt_x), mask=lvwmsk)
992            IF (  zmin < -5. .OR. zmax > 5.)   THEN
993               CALL ctl_stop('Error in vwdta',' routine obcdta')
994            ENDIF
995
996
997            IF ( lwp .AND.  ( kt == nit000 .OR. nprint /= 0 )  ) THEN
998               WRITE(numout,*)
999               WRITE(numout,*) ' Read West OBC data records ', ntobc_x
1000               ikprint = jpj/20 +1
1001               WRITE(numout,*) ' Temperature  record 1 - printout every 3 level'
1002               CALL prihre( twdta(:,:,nt_x), jpj, jpk, 1, jpj, ikprint, jpk, 1, -3, 1., numout )
1003               WRITE(numout,*)
1004               WRITE(numout,*) ' Salinity  record 1 - printout every 3 level'
1005               CALL prihre( swdta(:,:,nt_x),jpj,jpk, 1, jpj, ikprint,   jpk, 1, -3, 1., numout )
1006               WRITE(numout,*)
1007               WRITE(numout,*) ' Normal velocity U  record 1  - printout every 3 level'
1008               CALL prihre( uwdta(:,:,nt_x), jpj, jpk, 1, jpj, ikprint, jpk, 1, -3, 1., numout )
1009               WRITE(numout,*)
1010               WRITE(numout,*) ' Tangential velocity V  record 1  - printout every 3 level'
1011               CALL prihre( vwdta(:,:,nt_x), jpj, jpk, 1, jpj, ikprint, jpk, 1, -3, 1., numout )
1012            ENDIF
1013         END IF
1014      ENDIF
1015!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1016      IF( lp_obc_north) THEN
1017         IF(ln_obc_clim) THEN   ! revert to old convention for climatological OBC forcing
1018            cl_obc_nTS='obcnorth_TS.nc'
1019            cl_obc_nU ='obcnorth_U.nc'
1020            cl_obc_nV ='obcnorth_V.nc'
1021         ELSE                   ! convention for climatological OBC
1022            WRITE(cl_obc_nTS ,'("obc_north_TS_y" ,i4.4,"m",i2.2,".nc")' ) iyy,imm
1023            WRITE(cl_obc_nV  ,'("obc_north_V_y"  ,i4.4,"m",i2.2,".nc")' ) iyy,imm
1024            WRITE(cl_obc_nU  ,'("obc_north_U_y"  ,i4.4,"m",i2.2,".nc")' ) iyy,imm
1025         ENDIF
1026         istart(:)=(/nin0+nimpp-1,1/) ; icount(:)=(/nin1-nin0 +1,jpk/)
1027         IF (lwp) WRITE(numout,*) 'read data in :', TRIM(cl_obc_nTS)
1028         IF ( nin1 >= nin0 ) THEN
1029            CALL iom_open ( cl_obc_nTS , id_n )
1030            CALL iom_get ( id_n, jpdom_unknown, 'votemper', tndta(nin0:nin1,:,nt_x), &
1031               &               ktime=ntobc_x , kstart=istart, kcount= icount )
1032            CALL iom_get ( id_n, jpdom_unknown, 'vosaline', sndta(nin0:nin1,:,nt_x), &
1033               &               ktime=ntobc_x , kstart=istart, kcount= icount )
1034# if defined key_dynspg_ts || defined key_dynspg_exp
1035            CALL iom_get ( id_n, jpdom_unknown, 'vossurfh', sshndta(nin0:nin1,nt_x), &
1036               &               ktime=ntobc_x , kstart=istart, kcount= icount )
1037# endif
1038            CALL iom_close (id_n)
1039            !
1040            CALL iom_open ( cl_obc_nU , id_n )
1041            CALL iom_get  ( id_n, jpdom_unknown, 'vozocrtx', undta(nin0:nin1,:,nt_x), &
1042               &               ktime=ntobc_x , kstart=istart, kcount= icount )
1043            CALL iom_close ( id_n )
1044            !
1045            CALL iom_open ( cl_obc_nV , id_n )
1046            CALL iom_get  ( id_n, jpdom_unknown, 'vomecrty', vndta(nin0:nin1,:,nt_x), &
1047               &               ktime=ntobc_x , kstart=istart, kcount= icount )
1048            CALL iom_close ( id_n )
1049
1050            ! mask the boundary values
1051            tndta(:,:,nt_x) = tndta(:,:,nt_x)*tnmsk(:,:) ;  sndta(:,:,nt_x) = sndta(:,:,nt_x)*tnmsk(:,:)
1052            undta(:,:,nt_x) = undta(:,:,nt_x)*unmsk(:,:) ;  vndta(:,:,nt_x) = vndta(:,:,nt_x)*vnmsk(:,:)
1053
1054            ! check any outliers
1055            zmin=MINVAL( sndta(:,:,nt_x), mask=ltnmsk ) ; zmax=MAXVAL(sndta(:,:,nt_x), mask=ltnmsk)
1056            IF (  zmin < 5 .OR. zmax > 50)   THEN
1057               CALL ctl_stop('Error in sndta',' routine obcdta')
1058            ENDIF
1059            zmin=MINVAL( tndta(:,:,nt_x), mask=ltnmsk ) ; zmax=MAXVAL(tndta(:,:,nt_x), mask=ltnmsk)
1060            IF (  zmin < -10. .OR. zmax > 40)   THEN
1061               CALL ctl_stop('Error in tndta',' routine obcdta')
1062            ENDIF
1063            zmin=MINVAL( undta(:,:,nt_x), mask=lunmsk ) ; zmax=MAXVAL(undta(:,:,nt_x), mask=lunmsk)
1064            IF (  zmin < -5. .OR. zmax > 5.)   THEN
1065               CALL ctl_stop('Error in undta',' routine obcdta')
1066            ENDIF
1067            zmin=MINVAL( vndta(:,:,nt_x), mask=lvnmsk ) ; zmax=MAXVAL(vndta(:,:,nt_x), mask=lvnmsk)
1068            IF (  zmin < -5. .OR. zmax > 5.)   THEN
1069               CALL ctl_stop('Error in vndta',' routine obcdta')
1070            ENDIF
1071
1072            IF ( lwp .AND.  ( kt == nit000 .OR. nprint /= 0 )  ) THEN
1073               WRITE(numout,*)
1074               WRITE(numout,*) ' Read North OBC data records ', ntobc_x
1075               ikprint = jpi/20 +1
1076               WRITE(numout,*) ' Temperature  record 1 - printout every 3 level'
1077               CALL prihre( tndta(:,:,nt_x), jpi, jpk, 1, jpi, ikprint, jpk, 1, -3, 1., numout )
1078               WRITE(numout,*)
1079               WRITE(numout,*) ' Salinity  record 1 - printout every 3 level'
1080               CALL prihre( sndta(:,:,nt_x), jpi, jpk, 1, jpi, ikprint, jpk, 1, -3, 1., numout )
1081               WRITE(numout,*)
1082               WRITE(numout,*) ' Normal velocity V  record 1  - printout every 3 level'
1083               CALL prihre( vndta(:,:,nt_x), jpi, jpk, 1, jpi, ikprint, jpk, 1, -3, 1., numout )
1084               WRITE(numout,*)
1085               WRITE(numout,*) ' Tangential  velocity U  record 1  - printout every 3 level'
1086               CALL prihre( undta(:,:,nt_x), jpi, jpk, 1, jpi, ikprint, jpk, 1, -3, 1., numout )
1087            ENDIF
1088         ENDIF
1089      ENDIF
1090!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1091      IF( lp_obc_south) THEN
1092         IF(ln_obc_clim) THEN   ! revert to old convention for climatological OBC forcing
1093            cl_obc_sTS='obcsouth_TS.nc'
1094            cl_obc_sU ='obcsouth_U.nc'
1095            cl_obc_sV ='obcsouth_V.nc'
1096         ELSE                    ! convention for climatological OBC
1097            WRITE(cl_obc_sTS ,'("obc_south_TS_y" ,i4.4,"m",i2.2,".nc")' ) iyy,imm
1098            WRITE(cl_obc_sV  ,'("obc_south_V_y"  ,i4.4,"m",i2.2,".nc")' ) iyy,imm
1099            WRITE(cl_obc_sU  ,'("obc_south_U_y"  ,i4.4,"m",i2.2,".nc")' ) iyy,imm
1100         ENDIF
1101         istart(:)=(/nis0+nimpp-1,1/) ; icount(:)=(/nis1-nis0 +1,jpk/)
1102         IF (lwp) WRITE(numout,*) 'read data in :', TRIM(cl_obc_sTS)
1103         IF ( nis1 >= nis0 ) THEN
1104            CALL iom_open ( cl_obc_sTS , id_s )
1105            CALL iom_get ( id_s, jpdom_unknown, 'votemper', tsdta(nis0:nis1,:,nt_x), &
1106               &               ktime=ntobc_x , kstart=istart, kcount= icount )
1107            CALL iom_get ( id_s, jpdom_unknown, 'vosaline', ssdta(nis0:nis1,:,nt_x), &
1108               &               ktime=ntobc_x , kstart=istart, kcount= icount )
1109# if defined key_dynspg_ts || defined key_dynspg_exp
1110            CALL iom_get ( id_s, jpdom_unknown, 'vossurfh', sshsdta(nis0:nis1,nt_x), &
1111               &               ktime=ntobc_x , kstart=istart, kcount= icount )
1112# endif
1113            CALL iom_close (id_s)
1114            !
1115            CALL iom_open ( cl_obc_sU , id_s )
1116            CALL iom_get  ( id_s, jpdom_unknown, 'vozocrtx', usdta(nis0:nis1,:,nt_x), &
1117               &               ktime=ntobc_x , kstart=istart, kcount= icount )
1118            CALL iom_close ( id_s )
1119            !
1120            CALL iom_open ( cl_obc_sV , id_s )
1121            CALL iom_get  ( id_s, jpdom_unknown, 'vomecrty', vsdta(nis0:nis1,:,nt_x), &
1122               &               ktime=ntobc_x , kstart=istart, kcount= icount )
1123            CALL iom_close ( id_s )
1124
1125            ! mask the boundary values
1126            tsdta(:,:,nt_x) = tsdta(:,:,nt_x)*tsmsk(:,:) ;  ssdta(:,:,nt_x) = ssdta(:,:,nt_x)*tsmsk(:,:)
1127            usdta(:,:,nt_x) = usdta(:,:,nt_x)*usmsk(:,:) ;  vsdta(:,:,nt_x) = vsdta(:,:,nt_x)*vsmsk(:,:)
1128
1129            ! check any outliers
1130            zmin=MINVAL( ssdta(:,:,nt_x), mask=ltsmsk ) ; zmax=MAXVAL(ssdta(:,:,nt_x), mask=ltsmsk)
1131            IF (  zmin < 5 .OR. zmax > 50)   THEN
1132               CALL ctl_stop('Error in ssdta',' routine obcdta')
1133            ENDIF
1134            zmin=MINVAL( tsdta(:,:,nt_x), mask=ltsmsk ) ; zmax=MAXVAL(tsdta(:,:,nt_x), mask=ltsmsk)
1135            IF (  zmin < -10. .OR. zmax > 40)   THEN
1136               CALL ctl_stop('Error in tsdta',' routine obcdta')
1137            ENDIF
1138            zmin=MINVAL( usdta(:,:,nt_x), mask=lusmsk ) ; zmax=MAXVAL(usdta(:,:,nt_x), mask=lusmsk)
1139            IF (  zmin < -5. .OR. zmax > 5.)   THEN
1140               CALL ctl_stop('Error in usdta',' routine obcdta')
1141            ENDIF
1142            zmin=MINVAL( vsdta(:,:,nt_x), mask=lvsmsk ) ; zmax=MAXVAL(vsdta(:,:,nt_x), mask=lvsmsk)
1143            IF (  zmin < -5. .OR. zmax > 5.)   THEN
1144               CALL ctl_stop('Error in vsdta',' routine obcdta')
1145            ENDIF
1146
1147            IF ( lwp .AND.  ( kt == nit000 .OR. nprint /= 0 )  ) THEN
1148               WRITE(numout,*)
1149               WRITE(numout,*) ' Read South OBC data records ', ntobc_x
1150               ikprint = jpi/20 +1
1151               WRITE(numout,*) ' Temperature  record 1 - printout every 3 level'
1152               CALL prihre( tsdta(:,:,nt_x), jpi, jpk, 1, jpi, ikprint, jpk, 1, -3, 1., numout )
1153               WRITE(numout,*)
1154               WRITE(numout,*) ' Salinity  record 1 - printout every 3 level'
1155               CALL prihre( ssdta(:,:,nt_x), jpi, jpk, 1, jpi, ikprint, jpk, 1, -3, 1., numout )
1156               WRITE(numout,*)
1157               WRITE(numout,*) ' Normal velocity V  record 1  - printout every 3 level'
1158               CALL prihre( vsdta(:,:,nt_x), jpi, jpk, 1, jpi, ikprint, jpk, 1, -3, 1., numout )
1159               WRITE(numout,*)
1160               WRITE(numout,*) ' Tangential velocity U  record 1  - printout every 3 level'
1161               CALL prihre( usdta(:,:,nt_x), jpi, jpk, 1, jpi, ikprint, jpk, 1, -3, 1., numout )
1162            ENDIF
1163         ENDIF
1164      ENDIF
1165
1166# if defined key_dynspg_ts || defined key_dynspg_exp
1167      CALL obc_depth_average(nt_x)   ! computation of depth-averaged velocity
1168# endif
1169
1170!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1171   END SUBROUTINE obc_read
1172
1173   INTEGER FUNCTION nrecbef()
1174      !!-----------------------------------------------------------------------
1175      !!                     ***    FUNCTION nrecbef   ***
1176      !!
1177      !!  Purpose : - provide the before record number in files, with respect to zjcnes
1178      !!
1179      !!    History : 2008-04 : ( J.M. Molines ) Original code
1180      !!-----------------------------------------------------------------------
1181
1182      INTEGER :: it , idum
1183
1184      idum = itobc
1185      DO it =1, itobc
1186         IF ( ztcobc(it) > zjcnes ) THEN ;  idum = it - 1 ; EXIT ;  ENDIF
1187         ENDDO
1188         ! idum can be 0 (climato, before first record)
1189         IF ( idum == 0 ) THEN
1190            IF ( ln_obc_clim ) THEN
1191               idum = itobc
1192            ELSE
1193               ctmp1='obc_dta: find ntobc == 0 for  non climatological file '
1194               ctmp2='consider adding a first record in your data file '
1195               CALL ctl_stop(ctmp1, ctmp2)
1196            ENDIF
1197         ENDIF
1198         ! idum can be itobc ( zjcnes > ztcobc (itobc) )
1199         !  This is not a problem ...
1200         nrecbef = idum
1201
1202      END FUNCTION nrecbef
1203
1204      !!==============================================================================
1205      SUBROUTINE obc_depth_average(nt_x)
1206         !!-----------------------------------------------------------------------
1207         !!                     ***    ROUTINE obc_depth_average   ***
1208         !!
1209         !!  Purpose : - compute the depth-averaged velocity from depth-dependent OBC frames
1210         !!
1211         !!    History : 2009-01 : ( Fred Dupont ) Original code
1212         !!-----------------------------------------------------------------------
1213
1214         ! * Arguments
1215         INTEGER, INTENT( in ) :: nt_x
1216
1217         ! * Local variables
1218         INTEGER :: ji, jj, jk
1219
1220
1221         IF( lp_obc_east ) THEN
1222            ! initialisation to zero
1223            ubtedta(:,nt_x) = 0.e0
1224            vbtedta(:,nt_x) = 0.e0
1225            DO ji = nie0, nie1
1226               DO jj = 1, jpj
1227                  DO jk = 1, jpkm1
1228                     ubtedta(jj,nt_x) = ubtedta(jj,nt_x) + uedta(jj,jk,nt_x)*fse3u(ji,jj,jk)
1229                     vbtedta(jj,nt_x) = vbtedta(jj,nt_x) + vedta(jj,jk,nt_x)*fse3v(ji+1,jj,jk)
1230                  END DO
1231               END DO
1232            END DO
1233         ENDIF
1234
1235         IF( lp_obc_west) THEN
1236            ! initialisation to zero
1237            ubtwdta(:,nt_x) = 0.e0
1238            vbtwdta(:,nt_x) = 0.e0
1239            DO ji = niw0, niw1
1240               DO jj = 1, jpj
1241                  DO jk = 1, jpkm1
1242                     ubtwdta(jj,nt_x) = ubtwdta(jj,nt_x) + uwdta(jj,jk,1)*fse3u(ji,jj,jk)
1243                     vbtwdta(jj,nt_x) = vbtwdta(jj,nt_x) + vwdta(jj,jk,1)*fse3v(ji,jj,jk)
1244                  END DO
1245               END DO
1246            END DO
1247         ENDIF
1248
1249         IF( lp_obc_north) THEN
1250            ! initialisation to zero
1251            ubtndta(:,nt_x) = 0.e0
1252            vbtndta(:,nt_x) = 0.e0
1253            DO jj = njn0, njn1
1254               DO ji = 1, jpi
1255                  DO jk = 1, jpkm1
1256                     ubtndta(ji,nt_x) = ubtndta(ji,nt_x) + undta(ji,jk,nt_x)*fse3u(ji,jj+1,jk)
1257                     vbtndta(ji,nt_x) = vbtndta(ji,nt_x) + vndta(ji,jk,nt_x)*fse3v(ji,jj,jk)
1258                  END DO
1259               END DO
1260            END DO
1261         ENDIF
1262
1263         IF( lp_obc_south) THEN
1264            ! initialisation to zero
1265            ubtsdta(:,nt_x) = 0.e0
1266            vbtsdta(:,nt_x) = 0.e0
1267            DO jj = njs0, njs1
1268               DO ji = nis0, nis1
1269                  DO jk = 1, jpkm1
1270                     ubtsdta(ji,nt_x) = ubtsdta(ji,nt_x) + usdta(ji,jk,nt_x)*fse3u(ji,jj,jk)
1271                     vbtsdta(ji,nt_x) = vbtsdta(ji,nt_x) + vsdta(ji,jk,nt_x)*fse3v(ji,jj,jk)
1272                  END DO
1273               END DO
1274            END DO
1275         ENDIF
1276
1277      END SUBROUTINE obc_depth_average
1278
1279#else
1280      !!------------------------------------------------------------------------------
1281      !!   default option:           Dummy module          NO Open Boundary Conditions
1282      !!------------------------------------------------------------------------------
1283   CONTAINS
1284      SUBROUTINE obc_dta( kt )             ! Dummy routine
1285         INTEGER, INTENT (in) :: kt
1286         WRITE(*,*) 'obc_dta: You should not have seen this print! error?', kt
1287      END SUBROUTINE obc_dta
1288#endif
1289   END MODULE obcdta
Note: See TracBrowser for help on using the repository browser.