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.
bdydta.F90 in branches/UKMO/dev_r5518_GO6_package/NEMOGCM/NEMO/OPA_SRC/BDY – NEMO

source: branches/UKMO/dev_r5518_GO6_package/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90 @ 11101

Last change on this file since 11101 was 11101, checked in by frrh, 5 years ago

Merge changes from Met Office GMED ticket 450 to reduce unnecessary
text output from NEMO.
This output, which is typically not switchable, is rarely of interest
in normal (non-debugging) runs and simply redunantley consumes extra
file space.
Further, the presence of this text output has been shown to
significantly degrade performance of models which are run during
Met Office HPC RAID (disk) checks.
The new code introduces switches which are configurable via the
changes made in the associated Met Office MOCI ticket 399.

File size: 40.5 KB
Line 
1MODULE bdydta
2   !!======================================================================
3   !!                       ***  MODULE bdydta  ***
4   !! Open boundary data : read the data for the unstructured open boundaries.
5   !!======================================================================
6   !! History :  1.0  !  2005-01  (J. Chanut, A. Sellar)  Original code
7   !!             -   !  2007-01  (D. Storkey) Update to use IOM module
8   !!             -   !  2007-07  (D. Storkey) add bdy_dta_fla
9   !!            3.0  !  2008-04  (NEMO team)  add in the reference version
10   !!            3.3  !  2010-09  (E.O'Dea) modifications for Shelf configurations
11   !!            3.3  !  2010-09  (D.Storkey) add ice boundary conditions
12   !!            3.4  !  2011     (D. Storkey) rewrite in preparation for OBC-BDY merge
13   !!            3.6  !  2012-01  (C. Rousset) add ice boundary conditions for lim3
14   !!----------------------------------------------------------------------
15#if defined key_bdy
16   !!----------------------------------------------------------------------
17   !!   'key_bdy'                     Open Boundary Conditions
18   !!----------------------------------------------------------------------
19   !!    bdy_dta        : read external data along open boundaries from file
20   !!    bdy_dta_init   : initialise arrays etc for reading of external data
21   !!----------------------------------------------------------------------
22   USE timing          ! Timing
23   USE oce             ! ocean dynamics and tracers
24   USE dom_oce         ! ocean space and time domain
25   USE phycst          ! physical constants
26   USE bdy_oce         ! ocean open boundary conditions 
27   USE bdytides        ! tidal forcing at boundaries
28   USE fldread         ! read input fields
29   USE iom             ! IOM library
30   USE in_out_manager  ! I/O logical units
31   USE dynspg_oce, ONLY: lk_dynspg_ts ! Split-explicit free surface flag
32#if defined key_lim2
33   USE ice_2
34#elif defined key_lim3
35   USE ice
36   USE limvar          ! redistribute ice input into categories
37#endif
38   USE sbcapr
39
40   IMPLICIT NONE
41   PRIVATE
42
43   PUBLIC   bdy_dta          ! routine called by step.F90 and dynspg_ts.F90
44   PUBLIC   bdy_dta_init     ! routine called by nemogcm.F90
45
46   INTEGER, ALLOCATABLE, DIMENSION(:)   ::   nb_bdy_fld        ! Number of fields to update for each boundary set.
47   INTEGER                              ::   nb_bdy_fld_sum    ! Total number of fields to update for all boundary sets.
48
49   LOGICAL,           DIMENSION(jp_bdy) ::   ln_full_vel_array ! =T => full velocities in 3D boundary conditions
50                                                               ! =F => baroclinic velocities in 3D boundary conditions
51!$AGRIF_DO_NOT_TREAT
52   TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:), TARGET ::   bf        ! structure of input fields (file informations, fields read)
53!$AGRIF_END_DO_NOT_TREAT
54   TYPE(MAP_POINTER), ALLOCATABLE, DIMENSION(:) :: nbmap_ptr   ! array of pointers to nbmap
55
56#if defined key_lim3
57   LOGICAL :: ll_bdylim3                  ! determine whether ice input is lim2 (F) or lim3 (T) type
58   INTEGER :: jfld_hti, jfld_hts, jfld_ai ! indices of ice thickness, snow thickness and concentration in bf structure
59#endif
60
61#  include "domzgr_substitute.h90"
62   !!----------------------------------------------------------------------
63   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
64   !! $Id$
65   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
66   !!----------------------------------------------------------------------
67CONTAINS
68
69      SUBROUTINE bdy_dta( kt, jit, time_offset )
70      !!----------------------------------------------------------------------
71      !!                   ***  SUBROUTINE bdy_dta  ***
72      !!                   
73      !! ** Purpose :   Update external data for open boundary conditions
74      !!
75      !! ** Method  :   Use fldread.F90
76      !!               
77      !!----------------------------------------------------------------------
78      !!
79      INTEGER, INTENT( in )           ::   kt    ! ocean time-step index
80      INTEGER, INTENT( in ), OPTIONAL ::   jit   ! subcycle time-step index (for timesplitting option)
81      INTEGER, INTENT( in ), OPTIONAL ::   time_offset  ! time offset in units of timesteps. NB. if jit
82                                                        ! is present then units = subcycle timesteps.
83                                                        ! time_offset = 0 => get data at "now" time level
84                                                        ! time_offset = -1 => get data at "before" time level
85                                                        ! time_offset = +1 => get data at "after" time level
86                                                        ! etc.
87      !!
88      INTEGER     ::  ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd, jl  ! local indices
89      INTEGER,          DIMENSION(jpbgrd) ::   ilen1 
90      INTEGER, POINTER, DIMENSION(:)      ::   nblen, nblenrim  ! short cuts
91      TYPE(OBC_DATA), POINTER             ::   dta              ! short cut
92      !!
93      !!---------------------------------------------------------------------------
94      !!
95      IF( nn_timing == 1 ) CALL timing_start('bdy_dta')
96
97      ! Initialise data arrays once for all from initial conditions where required
98      !---------------------------------------------------------------------------
99      IF( kt .eq. nit000 .and. .not. PRESENT(jit) ) THEN
100
101         ! Calculate depth-mean currents
102         !-----------------------------
103         
104         DO ib_bdy = 1, nb_bdy
105
106            nblen => idx_bdy(ib_bdy)%nblen
107            nblenrim => idx_bdy(ib_bdy)%nblenrim
108            dta => dta_bdy(ib_bdy)
109
110            IF( nn_dyn2d_dta(ib_bdy) .eq. 0 ) THEN
111               ilen1(:) = nblen(:)
112               IF( dta%ll_ssh ) THEN
113                  igrd = 1
114                  DO ib = 1, ilen1(igrd)
115                     ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
116                     ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
117                     dta_bdy(ib_bdy)%ssh(ib) = sshn(ii,ij) * tmask(ii,ij,1)         
118                  END DO
119               END IF
120               IF( dta%ll_u2d ) THEN
121                  igrd = 2
122                  DO ib = 1, ilen1(igrd)
123                     ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
124                     ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
125                     dta_bdy(ib_bdy)%u2d(ib) = un_b(ii,ij) * umask(ii,ij,1)         
126                  END DO
127               END IF
128               IF( dta%ll_v2d ) THEN
129                  igrd = 3
130                  DO ib = 1, ilen1(igrd)
131                     ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
132                     ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
133                     dta_bdy(ib_bdy)%v2d(ib) = vn_b(ii,ij) * vmask(ii,ij,1)         
134                  END DO
135               END IF
136            ENDIF
137
138            IF( nn_dyn3d_dta(ib_bdy) .eq. 0 ) THEN
139               ilen1(:) = nblen(:)
140               IF( dta%ll_u3d ) THEN
141                  igrd = 2 
142                  DO ib = 1, ilen1(igrd)
143                     DO ik = 1, jpkm1
144                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
145                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
146                        dta_bdy(ib_bdy)%u3d(ib,ik) =  ( un(ii,ij,ik) - un_b(ii,ij) ) * umask(ii,ij,ik)         
147                     END DO
148                  END DO
149               END IF
150               IF( dta%ll_v3d ) THEN
151                  igrd = 3 
152                  DO ib = 1, ilen1(igrd)
153                     DO ik = 1, jpkm1
154                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
155                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
156                        dta_bdy(ib_bdy)%v3d(ib,ik) =  ( vn(ii,ij,ik) - vn_b(ii,ij) ) * vmask(ii,ij,ik)         
157                        END DO
158                  END DO
159               END IF
160            ENDIF
161
162            IF( nn_tra_dta(ib_bdy) .eq. 0 ) THEN
163               ilen1(:) = nblen(:)
164               IF( dta%ll_tem ) THEN
165                  igrd = 1 
166                  DO ib = 1, ilen1(igrd)
167                     DO ik = 1, jpkm1
168                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
169                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
170                        dta_bdy(ib_bdy)%tem(ib,ik) = tsn(ii,ij,ik,jp_tem) * tmask(ii,ij,ik)         
171                     END DO
172                  END DO
173               END IF
174               IF( dta%ll_sal ) THEN
175                  igrd = 1 
176                  DO ib = 1, ilen1(igrd)
177                     DO ik = 1, jpkm1
178                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
179                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
180                        dta_bdy(ib_bdy)%sal(ib,ik) = tsn(ii,ij,ik,jp_sal) * tmask(ii,ij,ik)         
181                     END DO
182                  END DO
183               END IF
184            ENDIF
185
186#if defined key_lim2
187            IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN
188               ilen1(:) = nblen(:)
189               IF( dta%ll_frld ) THEN
190                  igrd = 1 
191                  DO ib = 1, ilen1(igrd)
192                     ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
193                     ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
194                     dta_bdy(ib_bdy)%frld(ib) = frld(ii,ij) * tmask(ii,ij,1)         
195                  END DO
196               END IF
197               IF( dta%ll_hicif ) THEN
198                  igrd = 1 
199                  DO ib = 1, ilen1(igrd)
200                     ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
201                     ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
202                     dta_bdy(ib_bdy)%hicif(ib) = hicif(ii,ij) * tmask(ii,ij,1)         
203                  END DO
204               END IF
205               IF( dta%ll_hsnif ) THEN
206                  igrd = 1 
207                  DO ib = 1, ilen1(igrd)
208                     ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
209                     ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
210                     dta_bdy(ib_bdy)%hsnif(ib) = hsnif(ii,ij) * tmask(ii,ij,1)         
211                  END DO
212               END IF
213            ENDIF
214#elif defined key_lim3
215            IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN
216               ilen1(:) = nblen(:)
217               IF( dta%ll_a_i ) THEN
218                  igrd = 1   
219                  DO jl = 1, jpl
220                     DO ib = 1, ilen1(igrd)
221                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
222                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
223                        dta_bdy(ib_bdy)%a_i (ib,jl) =  a_i(ii,ij,jl) * tmask(ii,ij,1) 
224                     END DO
225                  END DO
226               ENDIF
227               IF( dta%ll_ht_i ) THEN
228                  igrd = 1   
229                  DO jl = 1, jpl
230                     DO ib = 1, ilen1(igrd)
231                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
232                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
233                        dta_bdy(ib_bdy)%ht_i (ib,jl) =  ht_i(ii,ij,jl) * tmask(ii,ij,1) 
234                     END DO
235                  END DO
236               ENDIF
237               IF( dta%ll_ht_s ) THEN
238                  igrd = 1   
239                  DO jl = 1, jpl
240                     DO ib = 1, ilen1(igrd)
241                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
242                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
243                        dta_bdy(ib_bdy)%ht_s (ib,jl) =  ht_s(ii,ij,jl) * tmask(ii,ij,1) 
244                     END DO
245                  END DO
246               ENDIF
247            ENDIF
248#endif
249
250         ENDDO ! ib_bdy
251
252
253      ENDIF ! kt .eq. nit000
254
255      ! update external data from files
256      !--------------------------------
257     
258      jstart = 1
259      DO ib_bdy = 1, nb_bdy   
260         dta => dta_bdy(ib_bdy)
261         IF( nn_dta(ib_bdy) .eq. 1 ) THEN ! skip this bit if no external data required
262     
263            IF( PRESENT(jit) ) THEN
264               ! Update barotropic boundary conditions only
265               ! jit is optional argument for fld_read and bdytide_update
266               IF( cn_dyn2d(ib_bdy) /= 'none' ) THEN
267                  IF( nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays
268                     IF( dta%ll_ssh ) dta%ssh(:) = 0.0
269                     IF( dta%ll_u2d ) dta%u2d(:) = 0.0
270                     IF( dta%ll_u3d ) dta%v2d(:) = 0.0
271                  ENDIF
272                  IF (cn_tra(ib_bdy) /= 'runoff') THEN
273                     IF( nn_dyn2d_dta(ib_bdy) .EQ. 1 .OR. nn_dyn2d_dta(ib_bdy) .EQ. 3 ) THEN
274
275                        jend = jstart + dta%nread(2) - 1
276                        CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend),  &
277                                     & kit=jit, kt_offset=time_offset )
278
279                        ! If full velocities in boundary data then extract barotropic velocities from 3D fields
280                        IF( ln_full_vel_array(ib_bdy) .AND.                                             &
281                          &    ( nn_dyn2d_dta(ib_bdy) .EQ. 1 .OR. nn_dyn2d_dta(ib_bdy) .EQ. 3 .OR.  &
282                          &      nn_dyn3d_dta(ib_bdy) .EQ. 1 ) )THEN
283
284                           igrd = 2                      ! zonal velocity
285                           dta%u2d(:) = 0.0
286                           DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd)
287                              ii   = idx_bdy(ib_bdy)%nbi(ib,igrd)
288                              ij   = idx_bdy(ib_bdy)%nbj(ib,igrd)
289                              DO ik = 1, jpkm1
290                                 dta%u2d(ib) = dta%u2d(ib) &
291                       &                          + fse3u(ii,ij,ik) * umask(ii,ij,ik) * dta%u3d(ib,ik)
292                              END DO
293                              dta%u2d(ib) =  dta%u2d(ib) * hur(ii,ij)
294                           END DO
295                           igrd = 3                      ! meridional velocity
296                           dta%v2d(:) = 0.0
297                           DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd)
298                              ii   = idx_bdy(ib_bdy)%nbi(ib,igrd)
299                              ij   = idx_bdy(ib_bdy)%nbj(ib,igrd)
300                              DO ik = 1, jpkm1
301                                 dta%v2d(ib) = dta%v2d(ib) &
302                       &                       + fse3v(ii,ij,ik) * vmask(ii,ij,ik) * dta%v3d(ib,ik)
303                              END DO
304                              dta%v2d(ib) =  dta%v2d(ib) * hvr(ii,ij)
305                           END DO
306                        ENDIF                   
307                     ENDIF
308                     IF( nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing
309                        CALL bdytide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta, td=tides(ib_bdy),   & 
310                          &                 jit=jit, time_offset=time_offset )
311                     ENDIF
312                  ENDIF
313               ENDIF
314            ELSE
315               IF (cn_tra(ib_bdy) == 'runoff') then      ! runoff condition
316                  jend = nb_bdy_fld(ib_bdy)
317                  CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend),  &
318                               & map=nbmap_ptr(jstart:jend), kt_offset=time_offset )
319                  !
320                  igrd = 2                      ! zonal velocity
321                  DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd)
322                     ii   = idx_bdy(ib_bdy)%nbi(ib,igrd)
323                     ij   = idx_bdy(ib_bdy)%nbj(ib,igrd)
324                     dta%u2d(ib) = dta%u2d(ib) / ( e2u(ii,ij) * hu_0(ii,ij) )
325                  END DO
326                  !
327                  igrd = 3                      ! meridional velocity
328                  DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd)
329                     ii   = idx_bdy(ib_bdy)%nbi(ib,igrd)
330                     ij   = idx_bdy(ib_bdy)%nbj(ib,igrd)
331                     dta%v2d(ib) = dta%v2d(ib) / ( e1v(ii,ij) * hv_0(ii,ij) )
332                  END DO
333               ELSE
334                  IF( nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays
335                     IF( dta%ll_ssh ) dta%ssh(:) = 0.0
336                     IF( dta%ll_u2d ) dta%u2d(:) = 0.0
337                     IF( dta%ll_v2d ) dta%v2d(:) = 0.0
338                  ENDIF
339                  IF( dta%nread(1) .gt. 0 ) THEN ! update external data
340                     jend = jstart + dta%nread(1) - 1
341                     CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), &
342                                  & map=nbmap_ptr(jstart:jend), kt_offset=time_offset )
343                  ENDIF
344                  ! If full velocities in boundary data then split into barotropic and baroclinic data
345                  IF( ln_full_vel_array(ib_bdy) .and.                                             &
346                    & ( nn_dyn2d_dta(ib_bdy) .EQ. 1 .OR. nn_dyn2d_dta(ib_bdy) .EQ. 3 .OR. &
347                    &   nn_dyn3d_dta(ib_bdy) .EQ. 1 ) ) THEN
348                     igrd = 2                      ! zonal velocity
349                     dta%u2d(:) = 0.0
350                     DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd)
351                        ii   = idx_bdy(ib_bdy)%nbi(ib,igrd)
352                        ij   = idx_bdy(ib_bdy)%nbj(ib,igrd)
353                        DO ik = 1, jpkm1
354                           dta%u2d(ib) = dta%u2d(ib) &
355                 &                       + fse3u(ii,ij,ik) * umask(ii,ij,ik) * dta%u3d(ib,ik)
356                        END DO
357                        dta%u2d(ib) =  dta%u2d(ib) * hur(ii,ij)
358                        DO ik = 1, jpkm1
359                           dta%u3d(ib,ik) = dta%u3d(ib,ik) - dta%u2d(ib)
360                        END DO
361                     END DO
362                     igrd = 3                      ! meridional velocity
363                     dta%v2d(:) = 0.0
364                     DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd)
365                        ii   = idx_bdy(ib_bdy)%nbi(ib,igrd)
366                        ij   = idx_bdy(ib_bdy)%nbj(ib,igrd)
367                        DO ik = 1, jpkm1
368                           dta%v2d(ib) = dta%v2d(ib) &
369                 &                       + fse3v(ii,ij,ik) * vmask(ii,ij,ik) * dta%v3d(ib,ik)
370                        END DO
371                        dta%v2d(ib) =  dta%v2d(ib) * hvr(ii,ij)
372                        DO ik = 1, jpkm1
373                           dta%v3d(ib,ik) = dta%v3d(ib,ik) - dta%v2d(ib)
374                        END DO
375                     END DO
376                  ENDIF
377
378               ENDIF
379#if defined key_lim3
380               IF( .NOT. ll_bdylim3 .AND. cn_ice_lim(ib_bdy) /= 'none' .AND. nn_ice_lim_dta(ib_bdy) == 1 ) THEN ! bdy ice input (case input is lim2 type)
381                CALL lim_var_itd ( bf(jfld_hti)%fnow(:,1,1), bf(jfld_hts)%fnow(:,1,1), bf(jfld_ai)%fnow(:,1,1), &
382                                  & dta_bdy(ib_bdy)%ht_i,     dta_bdy(ib_bdy)%ht_s,     dta_bdy(ib_bdy)%a_i     )
383               ENDIF
384#endif
385            ENDIF
386            jstart = jstart + dta%nread(1)
387         END IF ! nn_dta(ib_bdy) = 1
388      END DO  ! ib_bdy
389
390      ! bg jchanut tschanges
391#if defined key_tide
392      ! Add tides if not split-explicit free surface else this is done in ts loop
393      IF (.NOT.lk_dynspg_ts) CALL bdy_dta_tides( kt=kt, time_offset=time_offset )
394#endif
395      ! end jchanut tschanges
396
397      IF ( ln_apr_obc ) THEN
398         DO ib_bdy = 1, nb_bdy
399            IF (cn_tra(ib_bdy) /= 'runoff')THEN
400               igrd = 1                      ! meridional velocity
401               DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd)
402                  ii   = idx_bdy(ib_bdy)%nbi(ib,igrd)
403                  ij   = idx_bdy(ib_bdy)%nbj(ib,igrd)
404                  dta_bdy(ib_bdy)%ssh(ib) = dta_bdy(ib_bdy)%ssh(ib) + ssh_ib(ii,ij)
405               ENDDO
406            ENDIF
407         ENDDO
408      ENDIF
409
410      IF( nn_timing == 1 ) CALL timing_stop('bdy_dta')
411
412      END SUBROUTINE bdy_dta
413
414
415      SUBROUTINE bdy_dta_init
416      !!----------------------------------------------------------------------
417      !!                   ***  SUBROUTINE bdy_dta_init  ***
418      !!                   
419      !! ** Purpose :   Initialise arrays for reading of external data
420      !!                for open boundary conditions
421      !!
422      !! ** Method  :   
423      !!               
424      !!----------------------------------------------------------------------
425      USE dynspg_oce, ONLY: lk_dynspg_ts
426      !!
427      INTEGER     ::  ib_bdy, jfld, jstart, jend, ierror  ! local indices
428      INTEGER      ::   ios                               ! Local integer output status for namelist read
429      !!
430      CHARACTER(len=100)                     ::   cn_dir        ! Root directory for location of data files
431      CHARACTER(len=100), DIMENSION(nb_bdy)  ::   cn_dir_array  ! Root directory for location of data files
432      CHARACTER(len = 256)::   clname                           ! temporary file name
433      LOGICAL                                ::   ln_full_vel   ! =T => full velocities in 3D boundary data
434                                                                ! =F => baroclinic velocities in 3D boundary data
435      INTEGER                                ::   ilen_global   ! Max length required for global bdy dta arrays
436      INTEGER, ALLOCATABLE, DIMENSION(:)     ::   ilen1, ilen3  ! size of 1st and 3rd dimensions of local arrays
437      INTEGER, ALLOCATABLE, DIMENSION(:)     ::   ibdy           ! bdy set for a particular jfld
438      INTEGER, ALLOCATABLE, DIMENSION(:)     ::   igrid         ! index for grid type (1,2,3 = T,U,V)
439      INTEGER, POINTER, DIMENSION(:)         ::   nblen, nblenrim  ! short cuts
440      TYPE(OBC_DATA), POINTER                ::   dta           ! short cut
441#if defined key_lim3
442      INTEGER, DIMENSION(3) ::   zdimsz   ! number of elements in each of the 4 dimensions (i.e. i,j,t,ice-cat) for an array
443      INTEGER               ::   zndims   ! number of dimensions in an array (i.e. 3 = wo ice cat; 4 = w ice cat)
444      INTEGER               ::   inum,id1 ! local integer
445#endif
446      TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) ::   blf_i         !  array of namelist information structures
447      TYPE(FLD_N) ::   bn_tem, bn_sal, bn_u3d, bn_v3d   !
448      TYPE(FLD_N) ::   bn_ssh, bn_u2d, bn_v2d           ! informations about the fields to be read
449#if defined key_lim2
450      TYPE(FLD_N) ::   bn_frld, bn_hicif, bn_hsnif      !
451#elif defined key_lim3
452      TYPE(FLD_N) ::   bn_a_i, bn_ht_i, bn_ht_s     
453#endif
454      NAMELIST/nambdy_dta/ cn_dir, bn_tem, bn_sal, bn_u3d, bn_v3d, bn_ssh, bn_u2d, bn_v2d 
455#if defined key_lim2
456      NAMELIST/nambdy_dta/ bn_frld, bn_hicif, bn_hsnif
457#elif defined key_lim3
458      NAMELIST/nambdy_dta/ bn_a_i, bn_ht_i, bn_ht_s
459#endif
460      NAMELIST/nambdy_dta/ ln_full_vel
461      !!---------------------------------------------------------------------------
462
463      IF( nn_timing == 1 ) CALL timing_start('bdy_dta_init')
464
465      IF(lwp) WRITE(numout,*)
466      IF(lwp) WRITE(numout,*) 'bdy_dta_ini : initialization of data at the open boundaries'
467      IF(lwp) WRITE(numout,*) '~~~~~~~~~~'
468      IF(lwp) WRITE(numout,*) ''
469
470      ! Set nn_dta
471      DO ib_bdy = 1, nb_bdy
472         nn_dta(ib_bdy) = MAX(  nn_dyn2d_dta(ib_bdy)       &
473                               ,nn_dyn3d_dta(ib_bdy)       &
474                               ,nn_tra_dta(ib_bdy)         &
475#if ( defined key_lim2 || defined key_lim3 )
476                              ,nn_ice_lim_dta(ib_bdy)    &
477#endif
478                              )
479         IF(nn_dta(ib_bdy) .gt. 1) nn_dta(ib_bdy) = 1
480      END DO
481
482      ! Work out upper bound of how many fields there are to read in and allocate arrays
483      ! ---------------------------------------------------------------------------
484      ALLOCATE( nb_bdy_fld(nb_bdy) )
485      nb_bdy_fld(:) = 0
486      DO ib_bdy = 1, nb_bdy         
487         IF( cn_dyn2d(ib_bdy) /= 'none' .and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) THEN
488            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3
489         ENDIF
490         IF( cn_dyn3d(ib_bdy) /= 'none' .and. nn_dyn3d_dta(ib_bdy) .eq. 1 ) THEN
491            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2
492         ENDIF
493         IF( cn_tra(ib_bdy) /= 'none' .and. nn_tra_dta(ib_bdy) .eq. 1  ) THEN
494            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2
495         ENDIF
496#if ( defined key_lim2 || defined key_lim3 )
497         IF( cn_ice_lim(ib_bdy) /= 'none' .and. nn_ice_lim_dta(ib_bdy) .eq. 1  ) THEN
498            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3
499         ENDIF
500#endif               
501         IF(lwp) WRITE(numout,*) 'Maximum number of files to open =',nb_bdy_fld(ib_bdy)
502      ENDDO           
503
504      nb_bdy_fld_sum = SUM( nb_bdy_fld )
505
506      ALLOCATE( bf(nb_bdy_fld_sum), STAT=ierror )
507      IF( ierror > 0 ) THEN   
508         CALL ctl_stop( 'bdy_dta: unable to allocate bf structure' )   ;   RETURN 
509      ENDIF
510      ALLOCATE( blf_i(nb_bdy_fld_sum), STAT=ierror )
511      IF( ierror > 0 ) THEN   
512         CALL ctl_stop( 'bdy_dta: unable to allocate blf_i structure' )   ;   RETURN 
513      ENDIF
514      ALLOCATE( nbmap_ptr(nb_bdy_fld_sum), STAT=ierror )
515      IF( ierror > 0 ) THEN   
516         CALL ctl_stop( 'bdy_dta: unable to allocate nbmap_ptr structure' )   ;   RETURN 
517      ENDIF
518      ALLOCATE( ilen1(nb_bdy_fld_sum), ilen3(nb_bdy_fld_sum) ) 
519      ALLOCATE( ibdy(nb_bdy_fld_sum) ) 
520      ALLOCATE( igrid(nb_bdy_fld_sum) ) 
521
522      ! Read namelists
523      ! --------------
524      REWIND(numnam_ref)
525      REWIND(numnam_cfg)
526      jfld = 0 
527      DO ib_bdy = 1, nb_bdy         
528         IF( nn_dta(ib_bdy) .eq. 1 ) THEN
529            READ  ( numnam_ref, nambdy_dta, IOSTAT = ios, ERR = 901)
530901         IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy_dta in reference namelist', lwp )
531
532            READ  ( numnam_cfg, nambdy_dta, IOSTAT = ios, ERR = 902 )
533902         IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy_dta in configuration namelist', lwp )
534            IF(lwm .AND. nprint > 2) WRITE ( numond, nambdy_dta )
535
536            cn_dir_array(ib_bdy) = cn_dir
537            ln_full_vel_array(ib_bdy) = ln_full_vel
538
539            nblen => idx_bdy(ib_bdy)%nblen
540            nblenrim => idx_bdy(ib_bdy)%nblenrim
541            dta => dta_bdy(ib_bdy)
542            dta%nread(2) = 0
543
544            ! Only read in necessary fields for this set.
545            ! Important that barotropic variables come first.
546            IF( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) THEN
547
548               IF( dta%ll_ssh ) THEN
549                  if(lwp) write(numout,*) '++++++ reading in ssh field'
550                  jfld = jfld + 1
551                  blf_i(jfld) = bn_ssh
552                  ibdy(jfld) = ib_bdy
553                  igrid(jfld) = 1
554                  ilen1(jfld) = nblen(igrid(jfld))
555                  ilen3(jfld) = 1
556                  dta%nread(2) = dta%nread(2) + 1
557               ENDIF
558
559               IF( dta%ll_u2d .and. .not. ln_full_vel_array(ib_bdy) ) THEN
560                  if(lwp) write(numout,*) '++++++ reading in u2d field'
561                  jfld = jfld + 1
562                  blf_i(jfld) = bn_u2d
563                  ibdy(jfld) = ib_bdy
564                  igrid(jfld) = 2
565                  ilen1(jfld) = nblen(igrid(jfld))
566                  ilen3(jfld) = 1
567                  dta%nread(2) = dta%nread(2) + 1
568               ENDIF
569
570               IF( dta%ll_v2d .and. .not. ln_full_vel_array(ib_bdy) ) THEN
571                  if(lwp) write(numout,*) '++++++ reading in v2d field'
572                  jfld = jfld + 1
573                  blf_i(jfld) = bn_v2d
574                  ibdy(jfld) = ib_bdy
575                  igrid(jfld) = 3
576                  ilen1(jfld) = nblen(igrid(jfld))
577                  ilen3(jfld) = 1
578                  dta%nread(2) = dta%nread(2) + 1
579               ENDIF
580
581            ENDIF
582
583            ! read 3D velocities if baroclinic velocities require OR if
584            ! barotropic velocities required and ln_full_vel set to .true.
585            IF( nn_dyn3d_dta(ib_bdy) .eq. 1 .or. &
586           &  ( ln_full_vel_array(ib_bdy) .and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) ) THEN
587
588               IF( dta%ll_u3d .or. ( ln_full_vel_array(ib_bdy) .and. dta%ll_u2d ) ) THEN
589                  if(lwp) write(numout,*) '++++++ reading in u3d field'
590                  jfld = jfld + 1
591                  blf_i(jfld) = bn_u3d
592                  ibdy(jfld) = ib_bdy
593                  igrid(jfld) = 2
594                  ilen1(jfld) = nblen(igrid(jfld))
595                  ilen3(jfld) = jpk
596                  IF( ln_full_vel_array(ib_bdy) .and. dta%ll_u2d ) dta%nread(2) = dta%nread(2) + 1
597               ENDIF
598
599               IF( dta%ll_v3d .or. ( ln_full_vel_array(ib_bdy) .and. dta%ll_v2d ) ) THEN
600                  if(lwp) write(numout,*) '++++++ reading in v3d field'
601                  jfld = jfld + 1
602                  blf_i(jfld) = bn_v3d
603                  ibdy(jfld) = ib_bdy
604                  igrid(jfld) = 3
605                  ilen1(jfld) = nblen(igrid(jfld))
606                  ilen3(jfld) = jpk
607                  IF( ln_full_vel_array(ib_bdy) .and. dta%ll_v2d ) dta%nread(2) = dta%nread(2) + 1
608               ENDIF
609
610            ENDIF
611
612            ! temperature and salinity
613            IF( nn_tra_dta(ib_bdy) .eq. 1 ) THEN
614
615               IF( dta%ll_tem ) THEN
616                  if(lwp) write(numout,*) '++++++ reading in tem field'
617                  jfld = jfld + 1
618                  blf_i(jfld) = bn_tem
619                  ibdy(jfld) = ib_bdy
620                  igrid(jfld) = 1
621                  ilen1(jfld) = nblen(igrid(jfld))
622                  ilen3(jfld) = jpk
623               ENDIF
624
625               IF( dta%ll_sal ) THEN
626                  if(lwp) write(numout,*) '++++++ reading in sal field'
627                  jfld = jfld + 1
628                  blf_i(jfld) = bn_sal
629                  ibdy(jfld) = ib_bdy
630                  igrid(jfld) = 1
631                  ilen1(jfld) = nblen(igrid(jfld))
632                  ilen3(jfld) = jpk
633               ENDIF
634
635            ENDIF
636
637#if defined key_lim2
638            ! sea ice
639            IF( nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN
640
641               IF( dta%ll_frld ) THEN
642                  jfld = jfld + 1
643                  blf_i(jfld) = bn_frld
644                  ibdy(jfld) = ib_bdy
645                  igrid(jfld) = 1
646                  ilen1(jfld) = nblen(igrid(jfld))
647                  ilen3(jfld) = 1
648               ENDIF
649
650               IF( dta%ll_hicif ) THEN
651                  jfld = jfld + 1
652                  blf_i(jfld) = bn_hicif
653                  ibdy(jfld) = ib_bdy
654                  igrid(jfld) = 1
655                  ilen1(jfld) = nblen(igrid(jfld))
656                  ilen3(jfld) = 1
657               ENDIF
658
659               IF( dta%ll_hsnif ) THEN
660                  jfld = jfld + 1
661                  blf_i(jfld) = bn_hsnif
662                  ibdy(jfld) = ib_bdy
663                  igrid(jfld) = 1
664                  ilen1(jfld) = nblen(igrid(jfld))
665                  ilen3(jfld) = 1
666               ENDIF
667
668            ENDIF
669#elif defined key_lim3
670            ! sea ice
671            IF( nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN
672               ! Test for types of ice input (lim2 or lim3)
673               ! Build file name to find dimensions
674               clname=TRIM(bn_a_i%clname)
675               IF( .NOT. bn_a_i%ln_clim ) THEN   
676                                                  WRITE(clname, '(a,"_y",i4.4)' ) TRIM( bn_a_i%clname ), nyear    ! add year
677                  IF( bn_a_i%cltype /= 'yearly' ) WRITE(clname, '(a,"m" ,i2.2)' ) TRIM( clname        ), nmonth   ! add month
678               ELSE
679                  IF( bn_a_i%cltype /= 'yearly' ) WRITE(clname, '(a,"_m",i2.2)' ) TRIM( bn_a_i%clname ), nmonth   ! add month
680               ENDIF
681               IF( bn_a_i%cltype == 'daily' .OR. bn_a_i%cltype(1:4) == 'week' ) &
682               &                                  WRITE(clname, '(a,"d" ,i2.2)' ) TRIM( clname        ), nday     ! add day
683               !
684               CALL iom_open  ( clname, inum )
685               id1 = iom_varid( inum, bn_a_i%clvar, kdimsz=zdimsz, kndims=zndims, ldstop = .FALSE. )
686               CALL iom_close ( inum )
687
688                IF ( zndims == 4 ) THEN
689                 ll_bdylim3 = .TRUE.   ! lim3 input
690               ELSE
691                 ll_bdylim3 = .FALSE.  ! lim2 input     
692               ENDIF
693               ! End test
694
695               IF( dta%ll_a_i ) THEN
696                  jfld = jfld + 1
697                  blf_i(jfld) = bn_a_i
698                  ibdy(jfld) = ib_bdy
699                  igrid(jfld) = 1
700                  ilen1(jfld) = nblen(igrid(jfld))
701                  IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF
702               ENDIF
703
704               IF( dta%ll_ht_i ) THEN
705                  jfld = jfld + 1
706                  blf_i(jfld) = bn_ht_i
707                  ibdy(jfld) = ib_bdy
708                  igrid(jfld) = 1
709                  ilen1(jfld) = nblen(igrid(jfld))
710                  IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF
711               ENDIF
712
713               IF( dta%ll_ht_s ) THEN
714                  jfld = jfld + 1
715                   blf_i(jfld) = bn_ht_s
716                  ibdy(jfld) = ib_bdy
717                  igrid(jfld) = 1
718                  ilen1(jfld) = nblen(igrid(jfld))
719                  IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF
720               ENDIF
721
722            ENDIF
723#endif
724            ! Recalculate field counts
725            !-------------------------
726            IF( ib_bdy .eq. 1 ) THEN
727               nb_bdy_fld_sum = 0
728               nb_bdy_fld(ib_bdy) = jfld
729               nb_bdy_fld_sum     = jfld             
730            ELSE
731               nb_bdy_fld(ib_bdy) = jfld - nb_bdy_fld_sum
732               nb_bdy_fld_sum = nb_bdy_fld_sum + nb_bdy_fld(ib_bdy)
733            ENDIF
734
735            dta%nread(1) = nb_bdy_fld(ib_bdy)
736
737         ENDIF ! nn_dta .eq. 1
738      ENDDO ! ib_bdy
739
740      DO jfld = 1, nb_bdy_fld_sum
741         ALLOCATE( bf(jfld)%fnow(ilen1(jfld),1,ilen3(jfld)) )
742         IF( blf_i(jfld)%ln_tint ) ALLOCATE( bf(jfld)%fdta(ilen1(jfld),1,ilen3(jfld),2) )
743         nbmap_ptr(jfld)%ptr => idx_bdy(ibdy(jfld))%nbmap(:,igrid(jfld))
744         nbmap_ptr(jfld)%ll_unstruc = ln_coords_file(ibdy(jfld))
745      ENDDO
746
747      ! fill bf with blf_i and control print
748      !-------------------------------------
749      jstart = 1
750      DO ib_bdy = 1, nb_bdy
751         jend = jstart - 1 + nb_bdy_fld(ib_bdy) 
752         CALL fld_fill( bf(jstart:jend), blf_i(jstart:jend), cn_dir_array(ib_bdy), 'bdy_dta',   &
753         &              'open boundary conditions', 'nambdy_dta' )
754         jstart = jend + 1
755      ENDDO
756
757      ! Initialise local boundary data arrays
758      ! nn_xxx_dta=0 : allocate space - will be filled from initial conditions later
759      ! nn_xxx_dta=1 : point to "fnow" arrays
760      !-------------------------------------
761
762      jfld = 0
763      DO ib_bdy=1, nb_bdy
764
765         nblen => idx_bdy(ib_bdy)%nblen
766         dta => dta_bdy(ib_bdy)
767
768         if(lwp) then
769            write(numout,*) '++++++ dta%ll_ssh = ',dta%ll_ssh
770            write(numout,*) '++++++ dta%ll_u2d = ',dta%ll_u2d
771            write(numout,*) '++++++ dta%ll_v2d = ',dta%ll_v2d
772            write(numout,*) '++++++ dta%ll_u3d = ',dta%ll_u3d
773            write(numout,*) '++++++ dta%ll_v3d = ',dta%ll_v3d
774            write(numout,*) '++++++ dta%ll_tem = ',dta%ll_tem
775            write(numout,*) '++++++ dta%ll_sal = ',dta%ll_sal
776         endif
777
778         IF ( nn_dyn2d_dta(ib_bdy) .eq. 0 .or. nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN
779            if(lwp) write(numout,*) '++++++ dta%ssh/u2d/u3d allocated space'
780            IF( dta%ll_ssh ) ALLOCATE( dta%ssh(nblen(1)) )
781            IF( dta%ll_u2d ) ALLOCATE( dta%u2d(nblen(2)) )
782            IF( dta%ll_v2d ) ALLOCATE( dta%v2d(nblen(3)) )
783         ENDIF
784         IF ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) THEN
785            IF( dta%ll_ssh ) THEN
786               if(lwp) write(numout,*) '++++++ dta%ssh pointing to fnow'
787               jfld = jfld + 1
788               dta%ssh => bf(jfld)%fnow(:,1,1)
789            ENDIF
790            IF ( dta%ll_u2d ) THEN
791               IF ( ln_full_vel_array(ib_bdy) ) THEN
792                  if(lwp) write(numout,*) '++++++ dta%u2d allocated space'
793                  ALLOCATE( dta%u2d(nblen(2)) )
794               ELSE
795                  if(lwp) write(numout,*) '++++++ dta%u2d pointing to fnow'
796                  jfld = jfld + 1
797                  dta%u2d => bf(jfld)%fnow(:,1,1)
798               ENDIF
799            ENDIF
800            IF ( dta%ll_v2d ) THEN
801               IF ( ln_full_vel_array(ib_bdy) ) THEN
802                  if(lwp) write(numout,*) '++++++ dta%v2d allocated space'
803                  ALLOCATE( dta%v2d(nblen(3)) )
804               ELSE
805                  if(lwp) write(numout,*) '++++++ dta%v2d pointing to fnow'
806                  jfld = jfld + 1
807                  dta%v2d => bf(jfld)%fnow(:,1,1)
808               ENDIF
809            ENDIF
810         ENDIF
811
812         IF ( nn_dyn3d_dta(ib_bdy) .eq. 0 ) THEN
813            if(lwp) write(numout,*) '++++++ dta%u3d/v3d allocated space'
814            IF( dta%ll_u3d ) ALLOCATE( dta_bdy(ib_bdy)%u3d(nblen(2),jpk) )
815            IF( dta%ll_v3d ) ALLOCATE( dta_bdy(ib_bdy)%v3d(nblen(3),jpk) )
816         ENDIF
817         IF ( nn_dyn3d_dta(ib_bdy) .eq. 1 .or. &
818           &  ( ln_full_vel_array(ib_bdy) .and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) ) THEN
819            IF ( dta%ll_u3d .or. ( ln_full_vel_array(ib_bdy) .and. dta%ll_u2d ) ) THEN
820               if(lwp) write(numout,*) '++++++ dta%u3d pointing to fnow'
821               jfld = jfld + 1
822               dta_bdy(ib_bdy)%u3d => bf(jfld)%fnow(:,1,:)
823            ENDIF
824            IF ( dta%ll_v3d .or. ( ln_full_vel_array(ib_bdy) .and. dta%ll_v2d ) ) THEN
825               if(lwp) write(numout,*) '++++++ dta%v3d pointing to fnow'
826               jfld = jfld + 1
827               dta_bdy(ib_bdy)%v3d => bf(jfld)%fnow(:,1,:)
828            ENDIF
829         ENDIF
830
831         IF( nn_tra_dta(ib_bdy) .eq. 0 ) THEN
832            if(lwp) write(numout,*) '++++++ dta%tem/sal allocated space'
833            IF( dta%ll_tem ) ALLOCATE( dta_bdy(ib_bdy)%tem(nblen(1),jpk) )
834            IF( dta%ll_sal ) ALLOCATE( dta_bdy(ib_bdy)%sal(nblen(1),jpk) )
835         ELSE
836            IF( dta%ll_tem ) THEN
837               if(lwp) write(numout,*) '++++++ dta%tem pointing to fnow'
838               jfld = jfld + 1
839               dta_bdy(ib_bdy)%tem => bf(jfld)%fnow(:,1,:)
840            ENDIF
841            IF( dta%ll_sal ) THEN
842               if(lwp) write(numout,*) '++++++ dta%sal pointing to fnow'
843               jfld = jfld + 1
844               dta_bdy(ib_bdy)%sal => bf(jfld)%fnow(:,1,:)
845            ENDIF
846         ENDIF
847
848#if defined key_lim2
849         IF (cn_ice_lim(ib_bdy) /= 'none') THEN
850            IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN
851               ALLOCATE( dta_bdy(ib_bdy)%frld(nblen(1)) )
852               ALLOCATE( dta_bdy(ib_bdy)%hicif(nblen(1)) )
853               ALLOCATE( dta_bdy(ib_bdy)%hsnif(nblen(1)) )
854            ELSE
855               jfld = jfld + 1
856               dta_bdy(ib_bdy)%frld  => bf(jfld)%fnow(:,1,1)
857               jfld = jfld + 1
858               dta_bdy(ib_bdy)%hicif => bf(jfld)%fnow(:,1,1)
859               jfld = jfld + 1
860               dta_bdy(ib_bdy)%hsnif => bf(jfld)%fnow(:,1,1)
861            ENDIF
862         ENDIF
863#elif defined key_lim3
864         IF (cn_ice_lim(ib_bdy) /= 'none') THEN
865            IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN
866               ALLOCATE( dta_bdy(ib_bdy)%a_i (nblen(1),jpl) )
867               ALLOCATE( dta_bdy(ib_bdy)%ht_i(nblen(1),jpl) )
868               ALLOCATE( dta_bdy(ib_bdy)%ht_s(nblen(1),jpl) )
869            ELSE
870               IF ( ll_bdylim3 ) THEN ! case input is lim3 type
871                  jfld = jfld + 1
872                  dta_bdy(ib_bdy)%a_i  => bf(jfld)%fnow(:,1,:)
873                  jfld = jfld + 1
874                  dta_bdy(ib_bdy)%ht_i => bf(jfld)%fnow(:,1,:)
875                  jfld = jfld + 1
876                  dta_bdy(ib_bdy)%ht_s => bf(jfld)%fnow(:,1,:)
877               ELSE ! case input is lim2 type
878                  jfld_ai  = jfld + 1
879                  jfld_hti = jfld + 2
880                  jfld_hts = jfld + 3
881                  jfld     = jfld + 3
882                  ALLOCATE( dta_bdy(ib_bdy)%a_i (nblen(1),jpl) )
883                  ALLOCATE( dta_bdy(ib_bdy)%ht_i(nblen(1),jpl) )
884                  ALLOCATE( dta_bdy(ib_bdy)%ht_s(nblen(1),jpl) )
885                  dta_bdy(ib_bdy)%a_i (:,:) = 0.0
886                  dta_bdy(ib_bdy)%ht_i(:,:) = 0.0
887                  dta_bdy(ib_bdy)%ht_s(:,:) = 0.0
888               ENDIF
889
890            ENDIF
891         ENDIF
892#endif
893
894      ENDDO ! ib_bdy
895
896      IF(lwp .AND. lflush) CALL flush(numout)
897
898      IF( nn_timing == 1 ) CALL timing_stop('bdy_dta_init')
899
900      END SUBROUTINE bdy_dta_init
901
902#else
903   !!----------------------------------------------------------------------
904   !!   Dummy module                   NO Open Boundary Conditions
905   !!----------------------------------------------------------------------
906CONTAINS
907   SUBROUTINE bdy_dta( kt, jit, time_offset ) ! Empty routine
908      INTEGER, INTENT( in )           ::   kt   
909      INTEGER, INTENT( in ), OPTIONAL ::   jit   
910      INTEGER, INTENT( in ), OPTIONAL ::   time_offset
911      WRITE(*,*) 'bdy_dta: You should not have seen this print! error?', kt
912   END SUBROUTINE bdy_dta
913   SUBROUTINE bdy_dta_init()                  ! Empty routine
914      WRITE(*,*) 'bdy_dta_init: You should not have seen this print! error?'
915   END SUBROUTINE bdy_dta_init
916#endif
917
918   !!==============================================================================
919END MODULE bdydta
Note: See TracBrowser for help on using the repository browser.