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 @ 13354

Last change on this file since 13354 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
RevLine 
[911]1MODULE bdydta
[1125]2   !!======================================================================
3   !!                       ***  MODULE bdydta  ***
[911]4   !! Open boundary data : read the data for the unstructured open boundaries.
[1125]5   !!======================================================================
6   !! History :  1.0  !  2005-01  (J. Chanut, A. Sellar)  Original code
7   !!             -   !  2007-01  (D. Storkey) Update to use IOM module
[2528]8   !!             -   !  2007-07  (D. Storkey) add bdy_dta_fla
[1125]9   !!            3.0  !  2008-04  (NEMO team)  add in the reference version
[2528]10   !!            3.3  !  2010-09  (E.O'Dea) modifications for Shelf configurations
11   !!            3.3  !  2010-09  (D.Storkey) add ice boundary conditions
[3294]12   !!            3.4  !  2011     (D. Storkey) rewrite in preparation for OBC-BDY merge
[4292]13   !!            3.6  !  2012-01  (C. Rousset) add ice boundary conditions for lim3
[1125]14   !!----------------------------------------------------------------------
15#if defined key_bdy
16   !!----------------------------------------------------------------------
[3294]17   !!   'key_bdy'                     Open Boundary Conditions
[1125]18   !!----------------------------------------------------------------------
[3294]19   !!    bdy_dta        : read external data along open boundaries from file
20   !!    bdy_dta_init   : initialise arrays etc for reading of external data
[1125]21   !!----------------------------------------------------------------------
[3294]22   USE timing          ! Timing
[911]23   USE oce             ! ocean dynamics and tracers
24   USE dom_oce         ! ocean space and time domain
25   USE phycst          ! physical constants
[3294]26   USE bdy_oce         ! ocean open boundary conditions 
[911]27   USE bdytides        ! tidal forcing at boundaries
[3294]28   USE fldread         ! read input fields
29   USE iom             ! IOM library
[911]30   USE in_out_manager  ! I/O logical units
[4292]31   USE dynspg_oce, ONLY: lk_dynspg_ts ! Split-explicit free surface flag
[2528]32#if defined key_lim2
33   USE ice_2
[4292]34#elif defined key_lim3
35   USE ice
[5123]36   USE limvar          ! redistribute ice input into categories
[2528]37#endif
[3651]38   USE sbcapr
[911]39
40   IMPLICIT NONE
41   PRIVATE
42
[3294]43   PUBLIC   bdy_dta          ! routine called by step.F90 and dynspg_ts.F90
44   PUBLIC   bdy_dta_init     ! routine called by nemogcm.F90
[911]45
[3294]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.
[911]48
[3294]49   LOGICAL,           DIMENSION(jp_bdy) ::   ln_full_vel_array ! =T => full velocities in 3D boundary conditions
50                                                               ! =F => baroclinic velocities in 3D boundary conditions
[4354]51!$AGRIF_DO_NOT_TREAT
[3294]52   TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:), TARGET ::   bf        ! structure of input fields (file informations, fields read)
[4354]53!$AGRIF_END_DO_NOT_TREAT
[3294]54   TYPE(MAP_POINTER), ALLOCATABLE, DIMENSION(:) :: nbmap_ptr   ! array of pointers to nbmap
[911]55
[4292]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
[3294]61#  include "domzgr_substitute.h90"
[1125]62   !!----------------------------------------------------------------------
[2528]63   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
[6486]64   !! $Id$
[2528]65   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
[1125]66   !!----------------------------------------------------------------------
[911]67CONTAINS
68
[3294]69      SUBROUTINE bdy_dta( kt, jit, time_offset )
[1125]70      !!----------------------------------------------------------------------
[3294]71      !!                   ***  SUBROUTINE bdy_dta  ***
[911]72      !!                   
[3294]73      !! ** Purpose :   Update external data for open boundary conditions
[911]74      !!
[3294]75      !! ** Method  :   Use fldread.F90
76      !!               
[1125]77      !!----------------------------------------------------------------------
[911]78      !!
[3294]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      !!
[4292]88      INTEGER     ::  ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd, jl  ! local indices
[3294]89      INTEGER,          DIMENSION(jpbgrd) ::   ilen1 
90      INTEGER, POINTER, DIMENSION(:)      ::   nblen, nblenrim  ! short cuts
[4292]91      TYPE(OBC_DATA), POINTER             ::   dta              ! short cut
[3294]92      !!
[911]93      !!---------------------------------------------------------------------------
[3294]94      !!
95      IF( nn_timing == 1 ) CALL timing_start('bdy_dta')
[911]96
[3294]97      ! Initialise data arrays once for all from initial conditions where required
98      !---------------------------------------------------------------------------
99      IF( kt .eq. nit000 .and. .not. PRESENT(jit) ) THEN
[1125]100
[3294]101         ! Calculate depth-mean currents
102         !-----------------------------
103         
104         DO ib_bdy = 1, nb_bdy
[911]105
[3294]106            nblen => idx_bdy(ib_bdy)%nblen
107            nblenrim => idx_bdy(ib_bdy)%nblenrim
[4292]108            dta => dta_bdy(ib_bdy)
[2528]109
[4292]110            IF( nn_dyn2d_dta(ib_bdy) .eq. 0 ) THEN
[3651]111               ilen1(:) = nblen(:)
[4292]112               IF( dta%ll_ssh ) THEN
113                  igrd = 1
114                  DO ib = 1, ilen1(igrd)
[3294]115                     ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
116                     ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
[4292]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)
[3294]123                     ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
124                     ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
[4354]125                     dta_bdy(ib_bdy)%u2d(ib) = un_b(ii,ij) * umask(ii,ij,1)         
[4292]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)
[4354]133                     dta_bdy(ib_bdy)%v2d(ib) = vn_b(ii,ij) * vmask(ii,ij,1)         
[4292]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)
[4354]146                        dta_bdy(ib_bdy)%u3d(ib,ik) =  ( un(ii,ij,ik) - un_b(ii,ij) ) * umask(ii,ij,ik)         
[3294]147                     END DO
[4292]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)
[4354]156                        dta_bdy(ib_bdy)%v3d(ib,ik) =  ( vn(ii,ij,ik) - vn_b(ii,ij) ) * vmask(ii,ij,ik)         
[4292]157                        END DO
158                  END DO
159               END IF
[3294]160            ENDIF
[911]161
[4292]162            IF( nn_tra_dta(ib_bdy) .eq. 0 ) THEN
[3651]163               ilen1(:) = nblen(:)
[4292]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
[3294]184            ENDIF
[911]185
[3294]186#if defined key_lim2
[4333]187            IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN
[3651]188               ilen1(:) = nblen(:)
[4292]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
[1125]213            ENDIF
[4292]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
[3294]248#endif
[911]249
[3294]250         ENDDO ! ib_bdy
[911]251
252
[3294]253      ENDIF ! kt .eq. nit000
[911]254
[3294]255      ! update external data from files
256      !--------------------------------
257     
258      jstart = 1
259      DO ib_bdy = 1, nb_bdy   
[4292]260         dta => dta_bdy(ib_bdy)
[3294]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
[3651]265               ! jit is optional argument for fld_read and bdytide_update
[4292]266               IF( cn_dyn2d(ib_bdy) /= 'none' ) THEN
[3294]267                  IF( nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays
[4292]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
[3294]271                  ENDIF
[4292]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
[3703]274
[4292]275                        jend = jstart + dta%nread(2) - 1
[3703]276                        CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend),  &
[3851]277                                     & kit=jit, kt_offset=time_offset )
[3703]278
[4292]279                        ! If full velocities in boundary data then extract barotropic velocities from 3D fields
[3703]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
[3651]284                           igrd = 2                      ! zonal velocity
[4292]285                           dta%u2d(:) = 0.0
[3651]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
[4292]290                                 dta%u2d(ib) = dta%u2d(ib) &
291                       &                          + fse3u(ii,ij,ik) * umask(ii,ij,ik) * dta%u3d(ib,ik)
[3651]292                              END DO
[4292]293                              dta%u2d(ib) =  dta%u2d(ib) * hur(ii,ij)
[3651]294                           END DO
295                           igrd = 3                      ! meridional velocity
[4292]296                           dta%v2d(:) = 0.0
[3651]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
[4292]301                                 dta%v2d(ib) = dta%v2d(ib) &
302                       &                       + fse3v(ii,ij,ik) * vmask(ii,ij,ik) * dta%v3d(ib,ik)
[3651]303                              END DO
[4292]304                              dta%v2d(ib) =  dta%v2d(ib) * hvr(ii,ij)
[3651]305                           END DO
306                        ENDIF                   
307                     ENDIF
308                     IF( nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing
[4292]309                        CALL bdytide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta, td=tides(ib_bdy),   & 
[3651]310                          &                 jit=jit, time_offset=time_offset )
311                     ENDIF
[3294]312                  ENDIF
[1125]313               ENDIF
[3294]314            ELSE
[4292]315               IF (cn_tra(ib_bdy) == 'runoff') then      ! runoff condition
[3651]316                  jend = nb_bdy_fld(ib_bdy)
[3703]317                  CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend),  &
[3851]318                               & map=nbmap_ptr(jstart:jend), kt_offset=time_offset )
[3651]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)
[4292]324                     dta%u2d(ib) = dta%u2d(ib) / ( e2u(ii,ij) * hu_0(ii,ij) )
[3651]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)
[4292]331                     dta%v2d(ib) = dta%v2d(ib) / ( e1v(ii,ij) * hv_0(ii,ij) )
[3651]332                  END DO
333               ELSE
[4292]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
[3651]338                  ENDIF
[4292]339                  IF( dta%nread(1) .gt. 0 ) THEN ! update external data
340                     jend = jstart + dta%nread(1) - 1
[3703]341                     CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), &
[3851]342                                  & map=nbmap_ptr(jstart:jend), kt_offset=time_offset )
[3651]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.                                             &
[3703]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
[3651]348                     igrd = 2                      ! zonal velocity
[4292]349                     dta%u2d(:) = 0.0
[3651]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
[4292]354                           dta%u2d(ib) = dta%u2d(ib) &
355                 &                       + fse3u(ii,ij,ik) * umask(ii,ij,ik) * dta%u3d(ib,ik)
[3651]356                        END DO
[4292]357                        dta%u2d(ib) =  dta%u2d(ib) * hur(ii,ij)
[3651]358                        DO ik = 1, jpkm1
[4292]359                           dta%u3d(ib,ik) = dta%u3d(ib,ik) - dta%u2d(ib)
[3651]360                        END DO
361                     END DO
362                     igrd = 3                      ! meridional velocity
[4292]363                     dta%v2d(:) = 0.0
[3651]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
[4292]368                           dta%v2d(ib) = dta%v2d(ib) &
369                 &                       + fse3v(ii,ij,ik) * vmask(ii,ij,ik) * dta%v3d(ib,ik)
[3651]370                        END DO
[4292]371                        dta%v2d(ib) =  dta%v2d(ib) * hvr(ii,ij)
[3651]372                        DO ik = 1, jpkm1
[4292]373                           dta%v3d(ib,ik) = dta%v3d(ib,ik) - dta%v2d(ib)
[3651]374                        END DO
375                     END DO
376                  ENDIF
[4292]377
[1125]378               ENDIF
[4292]379#if defined key_lim3
[4608]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)
[5123]381                CALL lim_var_itd ( bf(jfld_hti)%fnow(:,1,1), bf(jfld_hts)%fnow(:,1,1), bf(jfld_ai)%fnow(:,1,1), &
[4292]382                                  & dta_bdy(ib_bdy)%ht_i,     dta_bdy(ib_bdy)%ht_s,     dta_bdy(ib_bdy)%a_i     )
383               ENDIF
384#endif
[1125]385            ENDIF
[4292]386            jstart = jstart + dta%nread(1)
[3651]387         END IF ! nn_dta(ib_bdy) = 1
388      END DO  ! ib_bdy
[911]389
[4292]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
[3651]397      IF ( ln_apr_obc ) THEN
398         DO ib_bdy = 1, nb_bdy
[4292]399            IF (cn_tra(ib_bdy) /= 'runoff')THEN
[3651]400               igrd = 1                      ! meridional velocity
401               DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd)
[3294]402                  ii   = idx_bdy(ib_bdy)%nbi(ib,igrd)
403                  ij   = idx_bdy(ib_bdy)%nbj(ib,igrd)
[3651]404                  dta_bdy(ib_bdy)%ssh(ib) = dta_bdy(ib_bdy)%ssh(ib) + ssh_ib(ii,ij)
405               ENDDO
[1125]406            ENDIF
[3651]407         ENDDO
408      ENDIF
[911]409
[3294]410      IF( nn_timing == 1 ) CALL timing_stop('bdy_dta')
[911]411
[3294]412      END SUBROUTINE bdy_dta
[911]413
414
[3294]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      !!
[4292]422      !! ** Method  :   
[3294]423      !!               
424      !!----------------------------------------------------------------------
425      USE dynspg_oce, ONLY: lk_dynspg_ts
426      !!
427      INTEGER     ::  ib_bdy, jfld, jstart, jend, ierror  ! local indices
[4147]428      INTEGER      ::   ios                               ! Local integer output status for namelist read
[3294]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
[6487]432      CHARACTER(len = 256)::   clname                           ! temporary file name
[3294]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
[4292]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
[3294]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
[2528]449#if defined key_lim2
[3294]450      TYPE(FLD_N) ::   bn_frld, bn_hicif, bn_hsnif      !
[4292]451#elif defined key_lim3
452      TYPE(FLD_N) ::   bn_a_i, bn_ht_i, bn_ht_s     
[2528]453#endif
[3294]454      NAMELIST/nambdy_dta/ cn_dir, bn_tem, bn_sal, bn_u3d, bn_v3d, bn_ssh, bn_u2d, bn_v2d 
[2528]455#if defined key_lim2
[3294]456      NAMELIST/nambdy_dta/ bn_frld, bn_hicif, bn_hsnif
[4292]457#elif defined key_lim3
458      NAMELIST/nambdy_dta/ bn_a_i, bn_ht_i, bn_ht_s
[3294]459#endif
460      NAMELIST/nambdy_dta/ ln_full_vel
461      !!---------------------------------------------------------------------------
[911]462
[3294]463      IF( nn_timing == 1 ) CALL timing_start('bdy_dta_init')
[911]464
[3651]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
[3294]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)         &
[4292]475#if ( defined key_lim2 || defined key_lim3 )
476                              ,nn_ice_lim_dta(ib_bdy)    &
[2528]477#endif
[3294]478                              )
479         IF(nn_dta(ib_bdy) .gt. 1) nn_dta(ib_bdy) = 1
480      END DO
[911]481
[3294]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         
[4292]487         IF( cn_dyn2d(ib_bdy) /= 'none' .and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) THEN
[3294]488            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3
489         ENDIF
[4292]490         IF( cn_dyn3d(ib_bdy) /= 'none' .and. nn_dyn3d_dta(ib_bdy) .eq. 1 ) THEN
[3294]491            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2
492         ENDIF
[4292]493         IF( cn_tra(ib_bdy) /= 'none' .and. nn_tra_dta(ib_bdy) .eq. 1  ) THEN
[3294]494            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2
495         ENDIF
[4292]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
[3294]498            nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3
499         ENDIF
500#endif               
[3651]501         IF(lwp) WRITE(numout,*) 'Maximum number of files to open =',nb_bdy_fld(ib_bdy)
[3294]502      ENDDO           
[2528]503
[3294]504      nb_bdy_fld_sum = SUM( nb_bdy_fld )
[911]505
[3294]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 
[911]509      ENDIF
[3294]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 
[1125]513      ENDIF
[3294]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) ) 
[911]521
[3294]522      ! Read namelists
523      ! --------------
[4147]524      REWIND(numnam_ref)
525      REWIND(numnam_cfg)
[3294]526      jfld = 0 
527      DO ib_bdy = 1, nb_bdy         
528         IF( nn_dta(ib_bdy) .eq. 1 ) THEN
[4147]529            READ  ( numnam_ref, nambdy_dta, IOSTAT = ios, ERR = 901)
530901         IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy_dta in reference namelist', lwp )
[911]531
[4147]532            READ  ( numnam_cfg, nambdy_dta, IOSTAT = ios, ERR = 902 )
533902         IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy_dta in configuration namelist', lwp )
[11101]534            IF(lwm .AND. nprint > 2) WRITE ( numond, nambdy_dta )
[4147]535
[3294]536            cn_dir_array(ib_bdy) = cn_dir
537            ln_full_vel_array(ib_bdy) = ln_full_vel
[911]538
[3294]539            nblen => idx_bdy(ib_bdy)%nblen
540            nblenrim => idx_bdy(ib_bdy)%nblenrim
[4292]541            dta => dta_bdy(ib_bdy)
542            dta%nread(2) = 0
[911]543
[3294]544            ! Only read in necessary fields for this set.
545            ! Important that barotropic variables come first.
[4292]546            IF( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) THEN
[911]547
[4292]548               IF( dta%ll_ssh ) THEN
549                  if(lwp) write(numout,*) '++++++ reading in ssh field'
[3294]550                  jfld = jfld + 1
551                  blf_i(jfld) = bn_ssh
552                  ibdy(jfld) = ib_bdy
553                  igrid(jfld) = 1
[3651]554                  ilen1(jfld) = nblen(igrid(jfld))
[3294]555                  ilen3(jfld) = 1
[4292]556                  dta%nread(2) = dta%nread(2) + 1
[3294]557               ENDIF
[911]558
[4292]559               IF( dta%ll_u2d .and. .not. ln_full_vel_array(ib_bdy) ) THEN
560                  if(lwp) write(numout,*) '++++++ reading in u2d field'
[3294]561                  jfld = jfld + 1
562                  blf_i(jfld) = bn_u2d
563                  ibdy(jfld) = ib_bdy
564                  igrid(jfld) = 2
[3651]565                  ilen1(jfld) = nblen(igrid(jfld))
[3294]566                  ilen3(jfld) = 1
[4292]567                  dta%nread(2) = dta%nread(2) + 1
568               ENDIF
[911]569
[4292]570               IF( dta%ll_v2d .and. .not. ln_full_vel_array(ib_bdy) ) THEN
571                  if(lwp) write(numout,*) '++++++ reading in v2d field'
[3294]572                  jfld = jfld + 1
573                  blf_i(jfld) = bn_v2d
574                  ibdy(jfld) = ib_bdy
575                  igrid(jfld) = 3
[3651]576                  ilen1(jfld) = nblen(igrid(jfld))
[3294]577                  ilen3(jfld) = 1
[4292]578                  dta%nread(2) = dta%nread(2) + 1
[3294]579               ENDIF
[911]580
[3294]581            ENDIF
[1125]582
[4292]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
[911]587
[4292]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
[911]598
[4292]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
[911]609
[3294]610            ENDIF
[911]611
[3294]612            ! temperature and salinity
[4292]613            IF( nn_tra_dta(ib_bdy) .eq. 1 ) THEN
[911]614
[4292]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
[911]624
[4292]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
[911]634
635            ENDIF
636
[3294]637#if defined key_lim2
638            ! sea ice
[4333]639            IF( nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN
[911]640
[4292]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
[911]649
[4292]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
[911]658
[4292]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
[911]667
[3294]668            ENDIF
[4292]669#elif defined key_lim3
670            ! sea ice
671            IF( nn_ice_lim_dta(ib_bdy) .eq. 1 ) THEN
[6487]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 )
[4292]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
[4333]722            ENDIF
[3294]723#endif
724            ! Recalculate field counts
725            !-------------------------
726            IF( ib_bdy .eq. 1 ) THEN
[4148]727               nb_bdy_fld_sum = 0
[3294]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
[911]734
[4292]735            dta%nread(1) = nb_bdy_fld(ib_bdy)
736
[3294]737         ENDIF ! nn_dta .eq. 1
738      ENDDO ! ib_bdy
[911]739
[3294]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))
[5132]744         nbmap_ptr(jfld)%ll_unstruc = ln_coords_file(ibdy(jfld))
[3294]745      ENDDO
[911]746
[3294]747      ! fill bf with blf_i and control print
748      !-------------------------------------
749      jstart = 1
750      DO ib_bdy = 1, nb_bdy
[4673]751         jend = jstart - 1 + nb_bdy_fld(ib_bdy) 
[3294]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
[911]756
[3294]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      !-------------------------------------
[911]761
[3294]762      jfld = 0
763      DO ib_bdy=1, nb_bdy
[911]764
[3294]765         nblen => idx_bdy(ib_bdy)%nblen
[4292]766         dta => dta_bdy(ib_bdy)
[911]767
[4292]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'
[3651]796                  jfld = jfld + 1
[4292]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)) )
[3294]804               ELSE
[4292]805                  if(lwp) write(numout,*) '++++++ dta%v2d pointing to fnow'
[3294]806                  jfld = jfld + 1
[4292]807                  dta%v2d => bf(jfld)%fnow(:,1,1)
[3294]808               ENDIF
809            ENDIF
810         ENDIF
[911]811
[4292]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) )
[3294]816         ENDIF
[4292]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
[3294]829         ENDIF
[911]830
[4292]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'
[3294]838               jfld = jfld + 1
839               dta_bdy(ib_bdy)%tem => bf(jfld)%fnow(:,1,:)
[4292]840            ENDIF
841            IF( dta%ll_sal ) THEN
842               if(lwp) write(numout,*) '++++++ dta%sal pointing to fnow'
[3294]843               jfld = jfld + 1
844               dta_bdy(ib_bdy)%sal => bf(jfld)%fnow(:,1,:)
845            ENDIF
846         ENDIF
[911]847
[3294]848#if defined key_lim2
[4608]849         IF (cn_ice_lim(ib_bdy) /= 'none') THEN
[4333]850            IF( nn_ice_lim_dta(ib_bdy) .eq. 0 ) THEN
[4292]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)) )
[3294]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
[911]862         ENDIF
[4292]863#elif defined key_lim3
[4608]864         IF (cn_ice_lim(ib_bdy) /= 'none') THEN
[4292]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
[3294]892#endif
[911]893
[3294]894      ENDDO ! ib_bdy
[911]895
[11101]896      IF(lwp .AND. lflush) CALL flush(numout)
897
[3294]898      IF( nn_timing == 1 ) CALL timing_stop('bdy_dta_init')
[911]899
[3294]900      END SUBROUTINE bdy_dta_init
[911]901
902#else
[1125]903   !!----------------------------------------------------------------------
[3294]904   !!   Dummy module                   NO Open Boundary Conditions
[1125]905   !!----------------------------------------------------------------------
[911]906CONTAINS
[3294]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
[911]916#endif
917
918   !!==============================================================================
919END MODULE bdydta
Note: See TracBrowser for help on using the repository browser.