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.
Changeset 8813 for branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC – NEMO

Ignore:
Timestamp:
2017-11-24T17:56:51+01:00 (6 years ago)
Author:
gm
Message:

#1911 (ENHANCE-09): PART I.3 - phasing with updated branch dev_r8183_ICEMODEL revision 8787

Location:
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90

    r8586 r8813  
    5151 
    5252#if defined key_lim3 
    53    LOGICAL :: ll_bdylim3                  ! determine whether ice input is 1cat (F) or Xcat (T) type 
    54    INTEGER :: jfld_hti, jfld_hts, jfld_ai ! indices of ice thickness, snow thickness and concentration in bf structure 
     53   INTEGER ::   nice_cat                      ! number of categories in the input file 
     54   INTEGER ::   jfld_hti, jfld_hts, jfld_ai  ! indices of ice thickness, snow thickness and concentration in bf structure 
    5555#endif 
    5656 
    5757   !!---------------------------------------------------------------------- 
    58    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     58   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    5959   !! $Id$  
    6060   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    8080      !                                               ! etc. 
    8181      ! 
    82       INTEGER ::  ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd, jl  ! local indices 
     82      INTEGER ::  jbdy, jfld, jstart, jend, ib, jl  ! dummy loop indices 
     83      INTEGER ::  ii, ij, ik, igrd                  ! local integers 
    8384      INTEGER,          DIMENSION(jpbgrd) ::   ilen1  
    8485      INTEGER, POINTER, DIMENSION(:)      ::   nblen, nblenrim  ! short cuts 
     
    9596         !----------------------------- 
    9697          
    97          DO ib_bdy = 1, nb_bdy 
     98         DO jbdy = 1, nb_bdy 
    9899            ! 
    99             nblen => idx_bdy(ib_bdy)%nblen 
    100             nblenrim => idx_bdy(ib_bdy)%nblenrim 
    101             dta => dta_bdy(ib_bdy) 
    102  
    103             IF( nn_dyn2d_dta(ib_bdy) == 0 ) THEN  
     100            nblen    => idx_bdy(jbdy)%nblen 
     101            nblenrim => idx_bdy(jbdy)%nblenrim 
     102            dta      => dta_bdy(jbdy) 
     103            ! 
     104            IF( nn_dyn2d_dta(jbdy) == 0 ) THEN  
    104105               ilen1(:) = nblen(:) 
    105106               IF( dta%ll_ssh ) THEN  
    106107                  igrd = 1 
    107108                  DO ib = 1, ilen1(igrd) 
    108                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    109                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    110                      dta_bdy(ib_bdy)%ssh(ib) = sshn(ii,ij) * tmask(ii,ij,1)          
     109                     ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     110                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     111                     dta_bdy(jbdy)%ssh(ib) = sshn(ii,ij) * tmask(ii,ij,1)          
    111112                  END DO  
    112                END IF 
     113               ENDIF 
    113114               IF( dta%ll_u2d ) THEN  
    114115                  igrd = 2 
    115116                  DO ib = 1, ilen1(igrd) 
    116                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    117                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    118                      dta_bdy(ib_bdy)%u2d(ib) = un_b(ii,ij) * umask(ii,ij,1)          
     117                     ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     118                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     119                     dta_bdy(jbdy)%u2d(ib) = un_b(ii,ij) * umask(ii,ij,1)          
    119120                  END DO  
    120                END IF 
     121               ENDIF 
    121122               IF( dta%ll_v2d ) THEN  
    122123                  igrd = 3 
    123124                  DO ib = 1, ilen1(igrd) 
    124                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    125                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    126                      dta_bdy(ib_bdy)%v2d(ib) = vn_b(ii,ij) * vmask(ii,ij,1)          
     125                     ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     126                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     127                     dta_bdy(jbdy)%v2d(ib) = vn_b(ii,ij) * vmask(ii,ij,1)          
    127128                  END DO  
    128                END IF 
    129             ENDIF 
    130  
    131             IF( nn_dyn3d_dta(ib_bdy) == 0 ) THEN  
     129               ENDIF 
     130            ENDIF 
     131            ! 
     132            IF( nn_dyn3d_dta(jbdy) == 0 ) THEN  
    132133               ilen1(:) = nblen(:) 
    133134               IF( dta%ll_u3d ) THEN  
     
    135136                  DO ib = 1, ilen1(igrd) 
    136137                     DO ik = 1, jpkm1 
    137                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    138                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    139                         dta_bdy(ib_bdy)%u3d(ib,ik) =  ( un(ii,ij,ik) - un_b(ii,ij) ) * umask(ii,ij,ik)          
     138                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     139                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     140                        dta_bdy(jbdy)%u3d(ib,ik) =  ( un(ii,ij,ik) - un_b(ii,ij) ) * umask(ii,ij,ik)          
    140141                     END DO 
    141142                  END DO  
    142                END IF 
     143               ENDIF 
    143144               IF( dta%ll_v3d ) THEN  
    144145                  igrd = 3  
    145146                  DO ib = 1, ilen1(igrd) 
    146147                     DO ik = 1, jpkm1 
    147                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    148                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    149                         dta_bdy(ib_bdy)%v3d(ib,ik) =  ( vn(ii,ij,ik) - vn_b(ii,ij) ) * vmask(ii,ij,ik)          
     148                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     149                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     150                        dta_bdy(jbdy)%v3d(ib,ik) =  ( vn(ii,ij,ik) - vn_b(ii,ij) ) * vmask(ii,ij,ik)          
    150151                        END DO 
    151152                  END DO  
    152                END IF 
    153             ENDIF 
    154  
    155             IF( nn_tra_dta(ib_bdy) == 0 ) THEN  
     153               ENDIF 
     154            ENDIF 
     155 
     156            IF( nn_tra_dta(jbdy) == 0 ) THEN  
    156157               ilen1(:) = nblen(:) 
    157158               IF( dta%ll_tem ) THEN 
     
    159160                  DO ib = 1, ilen1(igrd) 
    160161                     DO ik = 1, jpkm1 
    161                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    162                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    163                         dta_bdy(ib_bdy)%tem(ib,ik) = tsn(ii,ij,ik,jp_tem) * tmask(ii,ij,ik)          
     162                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     163                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     164                        dta_bdy(jbdy)%tem(ib,ik) = tsn(ii,ij,ik,jp_tem) * tmask(ii,ij,ik)          
    164165                     END DO 
    165166                  END DO  
    166                END IF 
     167               ENDIF 
    167168               IF( dta%ll_sal ) THEN 
    168169                  igrd = 1  
    169170                  DO ib = 1, ilen1(igrd) 
    170171                     DO ik = 1, jpkm1 
    171                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    172                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    173                         dta_bdy(ib_bdy)%sal(ib,ik) = tsn(ii,ij,ik,jp_sal) * tmask(ii,ij,ik)          
     172                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     173                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     174                        dta_bdy(jbdy)%sal(ib,ik) = tsn(ii,ij,ik,jp_sal) * tmask(ii,ij,ik)          
    174175                     END DO 
    175176                  END DO  
    176                END IF 
    177             ENDIF 
    178  
    179 #if defined key_lim3 
    180             IF( nn_ice_lim_dta(ib_bdy) == 0 ) THEN  
     177               ENDIF 
     178            ENDIF 
     179 
     180#if defined key_lim3 
     181            IF( nn_ice_lim_dta(jbdy) == 0 ) THEN    ! set ice to initial values 
    181182               ilen1(:) = nblen(:) 
    182183               IF( dta%ll_a_i ) THEN 
     
    184185                  DO jl = 1, jpl 
    185186                     DO ib = 1, ilen1(igrd) 
    186                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    187                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    188                         dta_bdy(ib_bdy)%a_i (ib,jl) =  a_i(ii,ij,jl) * tmask(ii,ij,1)  
     187                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     188                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     189                        dta_bdy(jbdy)%a_i (ib,jl) =  a_i(ii,ij,jl) * tmask(ii,ij,1)  
    189190                     END DO 
    190191                  END DO 
     
    194195                  DO jl = 1, jpl 
    195196                     DO ib = 1, ilen1(igrd) 
    196                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    197                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    198                         dta_bdy(ib_bdy)%h_i (ib,jl) =  h_i(ii,ij,jl) * tmask(ii,ij,1)  
     197                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     198                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     199                        dta_bdy(jbdy)%h_i (ib,jl) =  h_i(ii,ij,jl) * tmask(ii,ij,1)  
    199200                     END DO 
    200201                  END DO 
     
    204205                  DO jl = 1, jpl 
    205206                     DO ib = 1, ilen1(igrd) 
    206                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    207                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    208                         dta_bdy(ib_bdy)%h_s (ib,jl) =  h_s(ii,ij,jl) * tmask(ii,ij,1)  
     207                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     208                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     209                        dta_bdy(jbdy)%h_s (ib,jl) =  h_s(ii,ij,jl) * tmask(ii,ij,1)  
    209210                     END DO 
    210211                  END DO 
     
    212213            ENDIF 
    213214#endif 
    214          END DO ! ib_bdy 
     215         END DO ! jbdy 
    215216         ! 
    216217      ENDIF ! kt == nit000 
     
    220221      
    221222      jstart = 1 
    222       DO ib_bdy = 1, nb_bdy    
    223          dta => dta_bdy(ib_bdy) 
    224          IF( nn_dta(ib_bdy) == 1 ) THEN ! skip this bit if no external data required 
     223      DO jbdy = 1, nb_bdy    
     224         dta => dta_bdy(jbdy) 
     225         IF( nn_dta(jbdy) == 1 ) THEN ! skip this bit if no external data required 
    225226       
    226227            IF( PRESENT(jit) ) THEN 
    227228               ! Update barotropic boundary conditions only 
    228229               ! jit is optional argument for fld_read and bdytide_update 
    229                IF( cn_dyn2d(ib_bdy) /= 'none' ) THEN 
    230                   IF( nn_dyn2d_dta(ib_bdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
     230               IF( cn_dyn2d(jbdy) /= 'none' ) THEN 
     231                  IF( nn_dyn2d_dta(jbdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
    231232                     IF( dta%ll_ssh ) dta%ssh(:) = 0._wp 
    232233                     IF( dta%ll_u2d ) dta%u2d(:) = 0._wp 
    233234                     IF( dta%ll_u3d ) dta%v2d(:) = 0._wp 
    234235                  ENDIF 
    235                   IF (cn_tra(ib_bdy) /= 'runoff') THEN 
    236                      IF( nn_dyn2d_dta(ib_bdy) == 1 .OR. nn_dyn2d_dta(ib_bdy) == 3 ) THEN 
     236                  IF (cn_tra(jbdy) /= 'runoff') THEN 
     237                     IF( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 ) THEN 
    237238 
    238239                        jend = jstart + dta%nread(2) - 1 
    239                         IF( ln_full_vel_array(ib_bdy) ) THEN 
     240                        IF( ln_full_vel_array(jbdy) ) THEN 
    240241                           CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend),  & 
    241                                      & kit=jit, kt_offset=time_offset , jpk_bdy=nb_jpk_bdy, fvl=ln_full_vel_array(ib_bdy)  ) 
     242                                     & kit=jit, kt_offset=time_offset , jpk_bdy=nb_jpk_bdy, fvl=ln_full_vel_array(jbdy)  ) 
    242243                        ELSE 
    243244                           CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend),  & 
     
    246247 
    247248                        ! If full velocities in boundary data then extract barotropic velocities from 3D fields 
    248                         IF( ln_full_vel_array(ib_bdy) .AND.                                             & 
    249                           &    ( nn_dyn2d_dta(ib_bdy) == 1 .OR. nn_dyn2d_dta(ib_bdy) == 3 .OR.  & 
    250                           &      nn_dyn3d_dta(ib_bdy) == 1 ) )THEN 
     249                        IF( ln_full_vel_array(jbdy) .AND.                                             & 
     250                          &    ( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 .OR.  & 
     251                          &      nn_dyn3d_dta(jbdy) == 1 ) )THEN 
    251252 
    252253                           igrd = 2                      ! zonal velocity 
    253254                           dta%u2d(:) = 0._wp 
    254                            DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    255                               ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    256                               ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     255                           DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     256                              ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     257                              ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    257258                              DO ik = 1, jpkm1 
    258259                                 dta%u2d(ib) = dta%u2d(ib) & 
     
    263264                           igrd = 3                      ! meridional velocity 
    264265                           dta%v2d(:) = 0._wp 
    265                            DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    266                               ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    267                               ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     266                           DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     267                              ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     268                              ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    268269                              DO ik = 1, jpkm1 
    269270                                 dta%v2d(ib) = dta%v2d(ib) & 
     
    274275                        ENDIF                     
    275276                     ENDIF 
    276                      IF( nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing 
    277                         CALL bdytide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta, td=tides(ib_bdy),   &  
     277                     IF( nn_dyn2d_dta(jbdy) .ge. 2 ) THEN ! update tidal harmonic forcing 
     278                        CALL bdytide_update( kt=kt, idx=idx_bdy(jbdy), dta=dta, td=tides(jbdy),   &  
    278279                          &                 jit=jit, time_offset=time_offset ) 
    279280                     ENDIF 
     
    281282               ENDIF 
    282283            ELSE 
    283                IF (cn_tra(ib_bdy) == 'runoff') then      ! runoff condition 
    284                   jend = nb_bdy_fld(ib_bdy) 
     284               IF (cn_tra(jbdy) == 'runoff') then      ! runoff condition 
     285                  jend = nb_bdy_fld(jbdy) 
    285286                  CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend),  & 
    286287                               & map=nbmap_ptr(jstart:jend), kt_offset=time_offset ) 
    287288                  ! 
    288289                  igrd = 2                      ! zonal velocity 
    289                   DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    290                      ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    291                      ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     290                  DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     291                     ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     292                     ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    292293                     dta%u2d(ib) = dta%u2d(ib) / ( e2u(ii,ij) * hu_0(ii,ij) ) 
    293294                  END DO 
    294295                  ! 
    295296                  igrd = 3                      ! meridional velocity 
    296                   DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    297                      ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    298                      ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     297                  DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     298                     ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     299                     ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    299300                     dta%v2d(ib) = dta%v2d(ib) / ( e1v(ii,ij) * hv_0(ii,ij) ) 
    300301                  END DO 
    301302               ELSE 
    302                   IF( nn_dyn2d_dta(ib_bdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
     303                  IF( nn_dyn2d_dta(jbdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
    303304                     IF( dta%ll_ssh ) dta%ssh(:) = 0._wp 
    304305                     IF( dta%ll_u2d ) dta%u2d(:) = 0._wp 
     
    308309                     jend = jstart + dta%nread(1) - 1 
    309310                     CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), & 
    310                                   & map=nbmap_ptr(jstart:jend), kt_offset=time_offset, jpk_bdy=nb_jpk_bdy, fvl=ln_full_vel_array(ib_bdy) ) 
     311                                  & map=nbmap_ptr(jstart:jend), kt_offset=time_offset, jpk_bdy=nb_jpk_bdy, fvl=ln_full_vel_array(jbdy) ) 
    311312                  ENDIF 
    312313                  ! If full velocities in boundary data then split into barotropic and baroclinic data 
    313                   IF( ln_full_vel_array(ib_bdy) .and.                                             & 
    314                     & ( nn_dyn2d_dta(ib_bdy) == 1 .OR. nn_dyn2d_dta(ib_bdy) == 3 .OR. & 
    315                     &   nn_dyn3d_dta(ib_bdy) == 1 ) ) THEN 
     314                  IF( ln_full_vel_array(jbdy) .and.                                             & 
     315                    & ( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 .OR. & 
     316                    &   nn_dyn3d_dta(jbdy) == 1 ) ) THEN 
    316317                     igrd = 2                      ! zonal velocity 
    317318                     dta%u2d(:) = 0._wp 
    318                      DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    319                         ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    320                         ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     319                     DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     320                        ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     321                        ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    321322                        DO ik = 1, jpkm1 
    322323                           dta%u2d(ib) = dta%u2d(ib) & 
     
    330331                     igrd = 3                      ! meridional velocity 
    331332                     dta%v2d(:) = 0._wp 
    332                      DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    333                         ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    334                         ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     333                     DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     334                        ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     335                        ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    335336                        DO ik = 1, jpkm1 
    336337                           dta%v2d(ib) = dta%v2d(ib) & 
     
    346347               ENDIF 
    347348#if defined key_lim3 
    348                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 1cat) 
    349                 CALL ice_var_itd ( bf(jfld_hti)%fnow(:,1,1), bf(jfld_hts)%fnow(:,1,1), bf(jfld_ai)%fnow(:,1,1), & 
    350                                   & dta_bdy(ib_bdy)%h_i,     dta_bdy(ib_bdy)%h_s,     dta_bdy(ib_bdy)%a_i     ) 
     349               IF( cn_ice_lim(jbdy) /= 'none' .AND. nn_ice_lim_dta(jbdy) == 1 ) THEN 
     350                  IF( nice_cat == 1 ) THEN ! case input cat = 1 
     351                     CALL ice_var_itd ( bf(jfld_hti)%fnow(:,1,1), bf(jfld_hts)%fnow(:,1,1), bf(jfld_ai)%fnow(:,1,1), & 
     352                        &               dta_bdy(jbdy)%h_i     , dta_bdy(jbdy)%h_s     , dta_bdy(jbdy)%a_i    ) 
     353                  ELSEIF( nice_cat /= 1 .AND. nice_cat /= jpl ) THEN ! case input cat /=1 and /=jpl 
     354                     CALL ice_var_itd2( bf(jfld_hti)%fnow(:,1,:), bf(jfld_hts)%fnow(:,1,:), bf(jfld_ai)%fnow(:,1,:), & 
     355                        &               dta_bdy(jbdy)%h_i     , dta_bdy(jbdy)%h_s     , dta_bdy(jbdy)%a_i    ) 
     356                  ENDIF 
    351357               ENDIF 
    352358#endif 
    353359            ENDIF 
    354360            jstart = jstart + dta%nread(1) 
    355          END IF ! nn_dta(ib_bdy) = 1 
    356       END DO  ! ib_bdy 
     361         ENDIF    ! nn_dta(jbdy) = 1 
     362      END DO  ! jbdy 
    357363 
    358364      IF ( ln_tide ) THEN 
    359365         IF (ln_dynspg_ts) THEN      ! Fill temporary arrays with slow-varying bdy data                            
    360             DO ib_bdy = 1, nb_bdy    ! Tidal component added in ts loop 
    361                IF ( nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN 
    362                   nblen => idx_bdy(ib_bdy)%nblen 
    363                   nblenrim => idx_bdy(ib_bdy)%nblenrim 
    364                   IF( cn_dyn2d(ib_bdy) == 'frs' ) THEN; ilen1(:)=nblen(:) ; ELSE ; ilen1(:)=nblenrim(:) ; ENDIF  
    365                   IF ( dta_bdy(ib_bdy)%ll_ssh ) dta_bdy_s(ib_bdy)%ssh(1:ilen1(1)) = dta_bdy(ib_bdy)%ssh(1:ilen1(1)) 
    366                   IF ( dta_bdy(ib_bdy)%ll_u2d ) dta_bdy_s(ib_bdy)%u2d(1:ilen1(2)) = dta_bdy(ib_bdy)%u2d(1:ilen1(2)) 
    367                   IF ( dta_bdy(ib_bdy)%ll_v2d ) dta_bdy_s(ib_bdy)%v2d(1:ilen1(3)) = dta_bdy(ib_bdy)%v2d(1:ilen1(3)) 
     366            DO jbdy = 1, nb_bdy    ! Tidal component added in ts loop 
     367               IF ( nn_dyn2d_dta(jbdy) .ge. 2 ) THEN 
     368                  nblen => idx_bdy(jbdy)%nblen 
     369                  nblenrim => idx_bdy(jbdy)%nblenrim 
     370                  IF( cn_dyn2d(jbdy) == 'frs' ) THEN; ilen1(:)=nblen(:) ; ELSE ; ilen1(:)=nblenrim(:) ; ENDIF  
     371                  IF ( dta_bdy(jbdy)%ll_ssh ) dta_bdy_s(jbdy)%ssh(1:ilen1(1)) = dta_bdy(jbdy)%ssh(1:ilen1(1)) 
     372                  IF ( dta_bdy(jbdy)%ll_u2d ) dta_bdy_s(jbdy)%u2d(1:ilen1(2)) = dta_bdy(jbdy)%u2d(1:ilen1(2)) 
     373                  IF ( dta_bdy(jbdy)%ll_v2d ) dta_bdy_s(jbdy)%v2d(1:ilen1(3)) = dta_bdy(jbdy)%v2d(1:ilen1(3)) 
    368374               ENDIF 
    369375            END DO 
     
    375381 
    376382      IF ( ln_apr_obc ) THEN 
    377          DO ib_bdy = 1, nb_bdy 
    378             IF (cn_tra(ib_bdy) /= 'runoff')THEN 
     383         DO jbdy = 1, nb_bdy 
     384            IF (cn_tra(jbdy) /= 'runoff')THEN 
    379385               igrd = 1                      ! meridional velocity 
    380                DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 
    381                   ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    382                   ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    383                   dta_bdy(ib_bdy)%ssh(ib) = dta_bdy(ib_bdy)%ssh(ib) + ssh_ib(ii,ij) 
     386               DO ib = 1, idx_bdy(jbdy)%nblenrim(igrd) 
     387                  ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     388                  ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
     389                  dta_bdy(jbdy)%ssh(ib) = dta_bdy(jbdy)%ssh(ib) + ssh_ib(ii,ij) 
    384390               END DO 
    385391            ENDIF 
     
    402408      !!                 
    403409      !!---------------------------------------------------------------------- 
    404       INTEGER ::   ib_bdy, jfld, jstart, jend, ierror, ios     ! Local integers 
     410      INTEGER ::   jbdy, jfld, jstart, jend, ierror, ios     ! Local integers 
    405411      ! 
    406412      CHARACTER(len=100)                     ::   cn_dir        ! Root directory for location of data files 
     
    408414      CHARACTER(len = 256)::   clname                           ! temporary file name 
    409415      LOGICAL                                ::   ln_full_vel   ! =T => full velocities in 3D boundary data 
    410                                                                 ! =F => baroclinic velocities in 3D boundary data 
     416      !                                                         ! =F => baroclinic velocities in 3D boundary data 
    411417      INTEGER                                ::   ilen_global   ! Max length required for global bdy dta arrays 
    412418      INTEGER, ALLOCATABLE, DIMENSION(:)     ::   ilen1, ilen3  ! size of 1st and 3rd dimensions of local arrays 
     
    416422      TYPE(OBC_DATA), POINTER                ::   dta           ! short cut 
    417423#if defined key_lim3 
    418       INTEGER               ::   zndims   ! number of dimensions in an array (i.e. 3 = wo ice cat; 4 = w ice cat) 
     424      INTEGER               ::   kndims   ! number of dimensions in an array (i.e. 3 = wo ice cat; 4 = w ice cat) 
     425      INTEGER, DIMENSION(4) ::   kdimsz   ! size   of dimensions 
    419426      INTEGER               ::   inum,id1 ! local integer 
    420427#endif 
     
    440447 
    441448      ! Set nn_dta 
    442       DO ib_bdy = 1, nb_bdy 
    443          nn_dta(ib_bdy) = MAX(  nn_dyn2d_dta(ib_bdy)       & 
    444                                ,nn_dyn3d_dta(ib_bdy)       & 
    445                                ,nn_tra_dta(ib_bdy)         & 
    446 #if defined key_lim3 
    447                               ,nn_ice_lim_dta(ib_bdy)    & 
     449      DO jbdy = 1, nb_bdy 
     450         nn_dta(jbdy) = MAX(   nn_dyn2d_dta  (jbdy)    & 
     451            &                , nn_dyn3d_dta  (jbdy)    & 
     452            &                , nn_tra_dta    (jbdy)    & 
     453#if defined key_lim3 
     454            &                , nn_ice_lim_dta(jbdy)    & 
    448455#endif 
    449456                              ) 
    450          IF(nn_dta(ib_bdy) > 1) nn_dta(ib_bdy) = 1 
     457         IF(nn_dta(jbdy) > 1)   nn_dta(jbdy) = 1 
    451458      END DO 
    452459 
     
    455462      ALLOCATE( nb_bdy_fld(nb_bdy) ) 
    456463      nb_bdy_fld(:) = 0 
    457       DO ib_bdy = 1, nb_bdy          
    458          IF( cn_dyn2d(ib_bdy) /= 'none' .and. ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) ) THEN 
    459             nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3 
    460          ENDIF 
    461          IF( cn_dyn3d(ib_bdy) /= 'none' .and. nn_dyn3d_dta(ib_bdy) == 1 ) THEN 
    462             nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2 
    463          ENDIF 
    464          IF( cn_tra(ib_bdy) /= 'none' .and. nn_tra_dta(ib_bdy) == 1  ) THEN 
    465             nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2 
    466          ENDIF 
    467 #if defined key_lim3 
    468          IF( cn_ice_lim(ib_bdy) /= 'none' .and. nn_ice_lim_dta(ib_bdy) == 1  ) THEN 
    469             nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3 
     464      DO jbdy = 1, nb_bdy          
     465         IF( cn_dyn2d(jbdy) /= 'none' .AND. ( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) ) THEN 
     466            nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 3 
     467         ENDIF 
     468         IF( cn_dyn3d(jbdy) /= 'none' .AND. nn_dyn3d_dta(jbdy) == 1 ) THEN 
     469            nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 2 
     470         ENDIF 
     471         IF( cn_tra(jbdy) /= 'none' .AND. nn_tra_dta(jbdy) == 1  ) THEN 
     472            nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 2 
     473         ENDIF 
     474#if defined key_lim3 
     475         IF( cn_ice_lim(jbdy) /= 'none' .AND. nn_ice_lim_dta(jbdy) == 1  ) THEN 
     476            nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 3 
    470477         ENDIF 
    471478#endif                
    472          IF(lwp) WRITE(numout,*) 'Maximum number of files to open =',nb_bdy_fld(ib_bdy) 
     479         IF(lwp) WRITE(numout,*) 'Maximum number of files to open =', nb_bdy_fld(jbdy) 
    473480      END DO             
    474481 
     
    496503      REWIND(numnam_cfg) 
    497504      jfld = 0  
    498       DO ib_bdy = 1, nb_bdy          
    499          IF( nn_dta(ib_bdy) == 1 ) THEN 
     505      DO jbdy = 1, nb_bdy          
     506         IF( nn_dta(jbdy) == 1 ) THEN 
    500507            READ  ( numnam_ref, nambdy_dta, IOSTAT = ios, ERR = 901) 
    501508901         IF( ios /= 0 )   CALL ctl_nam ( ios , 'nambdy_dta in reference namelist', lwp ) 
     
    505512            IF(lwm) WRITE( numond, nambdy_dta ) 
    506513 
    507             cn_dir_array(ib_bdy) = cn_dir 
    508             ln_full_vel_array(ib_bdy) = ln_full_vel 
    509  
    510             nblen => idx_bdy(ib_bdy)%nblen 
    511             nblenrim => idx_bdy(ib_bdy)%nblenrim 
    512             dta => dta_bdy(ib_bdy) 
     514            cn_dir_array(jbdy) = cn_dir 
     515            ln_full_vel_array(jbdy) = ln_full_vel 
     516 
     517            nblen => idx_bdy(jbdy)%nblen 
     518            nblenrim => idx_bdy(jbdy)%nblenrim 
     519            dta => dta_bdy(jbdy) 
    513520            dta%nread(2) = 0 
    514521 
    515522            ! Only read in necessary fields for this set. 
    516523            ! Important that barotropic variables come first. 
    517             IF( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) THEN  
     524            IF( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) THEN  
    518525 
    519526               IF( dta%ll_ssh ) THEN  
     
    521528                  jfld = jfld + 1 
    522529                  blf_i(jfld) = bn_ssh 
    523                   ibdy(jfld) = ib_bdy 
     530                  ibdy(jfld) = jbdy 
    524531                  igrid(jfld) = 1 
    525532                  ilen1(jfld) = nblen(igrid(jfld)) 
     
    528535               ENDIF 
    529536 
    530                IF( dta%ll_u2d .and. .not. ln_full_vel_array(ib_bdy) ) THEN 
     537               IF( dta%ll_u2d .and. .not. ln_full_vel_array(jbdy) ) THEN 
    531538                  if(lwp) write(numout,*) '++++++ reading in u2d field' 
    532539                  jfld = jfld + 1 
    533540                  blf_i(jfld) = bn_u2d 
    534                   ibdy(jfld) = ib_bdy 
     541                  ibdy(jfld) = jbdy 
    535542                  igrid(jfld) = 2 
    536543                  ilen1(jfld) = nblen(igrid(jfld)) 
     
    539546               ENDIF 
    540547 
    541                IF( dta%ll_v2d .and. .not. ln_full_vel_array(ib_bdy) ) THEN 
     548               IF( dta%ll_v2d .and. .not. ln_full_vel_array(jbdy) ) THEN 
    542549                  if(lwp) write(numout,*) '++++++ reading in v2d field' 
    543550                  jfld = jfld + 1 
    544551                  blf_i(jfld) = bn_v2d 
    545                   ibdy(jfld) = ib_bdy 
     552                  ibdy(jfld) = jbdy 
    546553                  igrid(jfld) = 3 
    547554                  ilen1(jfld) = nblen(igrid(jfld)) 
     
    554561            ! read 3D velocities if baroclinic velocities require OR if 
    555562            ! barotropic velocities required and ln_full_vel set to .true. 
    556             IF( nn_dyn3d_dta(ib_bdy) == 1 .OR. & 
    557            &  ( ln_full_vel_array(ib_bdy) .AND. ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) ) ) THEN 
    558  
    559                IF( dta%ll_u3d .OR. ( ln_full_vel_array(ib_bdy) .and. dta%ll_u2d ) ) THEN 
     563            IF( nn_dyn3d_dta(jbdy) == 1 .OR. & 
     564           &  ( ln_full_vel_array(jbdy) .AND. ( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 ) ) ) THEN 
     565 
     566               IF( dta%ll_u3d .OR. ( ln_full_vel_array(jbdy) .and. dta%ll_u2d ) ) THEN 
    560567                  if(lwp) write(numout,*) '++++++ reading in u3d field' 
    561568                  jfld = jfld + 1 
    562569                  blf_i(jfld) = bn_u3d 
    563                   ibdy(jfld) = ib_bdy 
     570                  ibdy(jfld) = jbdy 
    564571                  igrid(jfld) = 2 
    565572                  ilen1(jfld) = nblen(igrid(jfld)) 
    566573                  ilen3(jfld) = jpk 
    567                   IF( ln_full_vel_array(ib_bdy) .and. dta%ll_u2d ) dta%nread(2) = dta%nread(2) + 1 
    568                ENDIF 
    569  
    570                IF( dta%ll_v3d .OR. ( ln_full_vel_array(ib_bdy) .and. dta%ll_v2d ) ) THEN 
     574                  IF( ln_full_vel_array(jbdy) .and. dta%ll_u2d ) dta%nread(2) = dta%nread(2) + 1 
     575               ENDIF 
     576 
     577               IF( dta%ll_v3d .OR. ( ln_full_vel_array(jbdy) .and. dta%ll_v2d ) ) THEN 
    571578                  if(lwp) write(numout,*) '++++++ reading in v3d field' 
    572579                  jfld = jfld + 1 
    573580                  blf_i(jfld) = bn_v3d 
    574                   ibdy(jfld) = ib_bdy 
     581                  ibdy(jfld) = jbdy 
    575582                  igrid(jfld) = 3 
    576583                  ilen1(jfld) = nblen(igrid(jfld)) 
    577584                  ilen3(jfld) = jpk 
    578                   IF( ln_full_vel_array(ib_bdy) .and. dta%ll_v2d ) dta%nread(2) = dta%nread(2) + 1 
     585                  IF( ln_full_vel_array(jbdy) .and. dta%ll_v2d ) dta%nread(2) = dta%nread(2) + 1 
    579586               ENDIF 
    580587 
     
    582589 
    583590            ! temperature and salinity 
    584             IF( nn_tra_dta(ib_bdy) == 1 ) THEN 
     591            IF( nn_tra_dta(jbdy) == 1 ) THEN 
    585592 
    586593               IF( dta%ll_tem ) THEN 
     
    588595                  jfld = jfld + 1 
    589596                  blf_i(jfld) = bn_tem 
    590                   ibdy(jfld) = ib_bdy 
     597                  ibdy(jfld) = jbdy 
    591598                  igrid(jfld) = 1 
    592599                  ilen1(jfld) = nblen(igrid(jfld)) 
     
    598605                  jfld = jfld + 1 
    599606                  blf_i(jfld) = bn_sal 
    600                   ibdy(jfld) = ib_bdy 
     607                  ibdy(jfld) = jbdy 
    601608                  igrid(jfld) = 1 
    602609                  ilen1(jfld) = nblen(igrid(jfld)) 
     
    608615#if defined key_lim3 
    609616            ! sea ice 
    610             IF( nn_ice_lim_dta(ib_bdy) == 1 ) THEN 
     617            IF( nn_ice_lim_dta(jbdy) == 1 ) THEN 
    611618               ! Test for types of ice input (1cat or Xcat)  
    612619               ! Build file name to find dimensions  
     
    622629               ! 
    623630               CALL iom_open  ( clname, inum ) 
    624                id1 = iom_varid( inum, bn_a_i%clvar, kndims=zndims, ldstop = .FALSE. ) 
     631               id1 = iom_varid( inum, bn_a_i%clvar, kdimsz=kdimsz, kndims=kndims, ldstop = .FALSE. ) 
    625632               CALL iom_close ( inum ) 
    626633 
    627                 IF ( zndims == 4 ) THEN 
    628                  ll_bdylim3 = .TRUE.   ! Xcat input 
     634                IF ( kndims == 4 ) THEN 
     635                 nice_cat = kdimsz(4)   ! Xcat input 
    629636               ELSE 
    630                  ll_bdylim3 = .FALSE.  ! 1cat input       
     637                 nice_cat = 1           ! 1cat input       
    631638               ENDIF 
    632639               ! End test 
     
    635642                  jfld = jfld + 1 
    636643                  blf_i(jfld) = bn_a_i 
    637                   ibdy(jfld) = ib_bdy 
     644                  ibdy(jfld)  = jbdy 
    638645                  igrid(jfld) = 1 
    639646                  ilen1(jfld) = nblen(igrid(jfld)) 
    640                   IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
     647                  ilen3(jfld) = nice_cat 
    641648               ENDIF 
    642649 
     
    644651                  jfld = jfld + 1 
    645652                  blf_i(jfld) = bn_h_i 
    646                   ibdy(jfld) = ib_bdy 
     653                  ibdy(jfld)  = jbdy 
    647654                  igrid(jfld) = 1 
    648655                  ilen1(jfld) = nblen(igrid(jfld)) 
    649                   IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
     656                  ilen3(jfld) = nice_cat 
    650657               ENDIF 
    651658 
    652659               IF( dta%ll_h_s ) THEN 
    653660                  jfld = jfld + 1 
    654                    blf_i(jfld) = bn_h_s 
    655                   ibdy(jfld) = ib_bdy 
     661                  blf_i(jfld) = bn_h_s 
     662                  ibdy(jfld)  = jbdy 
    656663                  igrid(jfld) = 1 
    657664                  ilen1(jfld) = nblen(igrid(jfld)) 
    658                   IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
     665                  ilen3(jfld) = nice_cat 
    659666               ENDIF 
    660667 
     
    663670            ! Recalculate field counts 
    664671            !------------------------- 
    665             IF( ib_bdy == 1 ) THEN  
     672            IF( jbdy == 1 ) THEN  
    666673               nb_bdy_fld_sum = 0 
    667                nb_bdy_fld(ib_bdy) = jfld 
     674               nb_bdy_fld(jbdy) = jfld 
    668675               nb_bdy_fld_sum     = jfld               
    669676            ELSE 
    670                nb_bdy_fld(ib_bdy) = jfld - nb_bdy_fld_sum 
    671                nb_bdy_fld_sum = nb_bdy_fld_sum + nb_bdy_fld(ib_bdy) 
    672             ENDIF 
    673  
    674             dta%nread(1) = nb_bdy_fld(ib_bdy) 
     677               nb_bdy_fld(jbdy) = jfld - nb_bdy_fld_sum 
     678               nb_bdy_fld_sum = nb_bdy_fld_sum + nb_bdy_fld(jbdy) 
     679            ENDIF 
     680 
     681            dta%nread(1) = nb_bdy_fld(jbdy) 
    675682 
    676683         ENDIF ! nn_dta == 1 
    677       ENDDO ! ib_bdy 
     684      ENDDO ! jbdy 
    678685 
    679686      DO jfld = 1, nb_bdy_fld_sum 
     
    687694      !------------------------------------- 
    688695      jstart = 1 
    689       DO ib_bdy = 1, nb_bdy 
    690          jend = jstart - 1 + nb_bdy_fld(ib_bdy)  
    691          CALL fld_fill( bf(jstart:jend), blf_i(jstart:jend), cn_dir_array(ib_bdy), 'bdy_dta',   & 
     696      DO jbdy = 1, nb_bdy 
     697         jend = jstart - 1 + nb_bdy_fld(jbdy)  
     698         CALL fld_fill( bf(jstart:jend), blf_i(jstart:jend), cn_dir_array(jbdy), 'bdy_dta',   & 
    692699         &              'open boundary conditions', 'nambdy_dta' ) 
    693700         jstart = jend + 1 
     
    700707 
    701708      jfld = 0 
    702       DO ib_bdy=1, nb_bdy 
    703  
    704          nblen => idx_bdy(ib_bdy)%nblen 
    705          dta => dta_bdy(ib_bdy) 
     709      DO jbdy=1, nb_bdy 
     710 
     711         nblen => idx_bdy(jbdy)%nblen 
     712         dta => dta_bdy(jbdy) 
    706713 
    707714         if(lwp) then 
     
    715722         endif 
    716723 
    717          IF ( nn_dyn2d_dta(ib_bdy) == 0 .or. nn_dyn2d_dta(ib_bdy) == 2 ) THEN 
     724         IF ( nn_dyn2d_dta(jbdy) == 0 .or. nn_dyn2d_dta(jbdy) == 2 ) THEN 
    718725            if(lwp) write(numout,*) '++++++ dta%ssh/u2d/u3d allocated space' 
    719726            IF( dta%ll_ssh ) ALLOCATE( dta%ssh(nblen(1)) ) 
     
    721728            IF( dta%ll_v2d ) ALLOCATE( dta%v2d(nblen(3)) ) 
    722729         ENDIF 
    723          IF ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) THEN 
     730         IF ( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) THEN 
    724731            IF( dta%ll_ssh ) THEN 
    725732               if(lwp) write(numout,*) '++++++ dta%ssh pointing to fnow' 
     
    728735            ENDIF 
    729736            IF ( dta%ll_u2d ) THEN 
    730                IF ( ln_full_vel_array(ib_bdy) ) THEN 
     737               IF ( ln_full_vel_array(jbdy) ) THEN 
    731738                  if(lwp) write(numout,*) '++++++ dta%u2d allocated space' 
    732739                  ALLOCATE( dta%u2d(nblen(2)) ) 
     
    738745            ENDIF 
    739746            IF ( dta%ll_v2d ) THEN 
    740                IF ( ln_full_vel_array(ib_bdy) ) THEN 
     747               IF ( ln_full_vel_array(jbdy) ) THEN 
    741748                  if(lwp) write(numout,*) '++++++ dta%v2d allocated space' 
    742749                  ALLOCATE( dta%v2d(nblen(3)) ) 
     
    749756         ENDIF 
    750757 
    751          IF ( nn_dyn3d_dta(ib_bdy) == 0 ) THEN 
     758         IF ( nn_dyn3d_dta(jbdy) == 0 ) THEN 
    752759            if(lwp) write(numout,*) '++++++ dta%u3d/v3d allocated space' 
    753             IF( dta%ll_u3d ) ALLOCATE( dta_bdy(ib_bdy)%u3d(nblen(2),jpk) ) 
    754             IF( dta%ll_v3d ) ALLOCATE( dta_bdy(ib_bdy)%v3d(nblen(3),jpk) ) 
    755          ENDIF 
    756          IF ( nn_dyn3d_dta(ib_bdy) == 1 .or. & 
    757            &  ( ln_full_vel_array(ib_bdy) .and. ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) ) ) THEN 
    758             IF ( dta%ll_u3d .or. ( ln_full_vel_array(ib_bdy) .and. dta%ll_u2d ) ) THEN 
     760            IF( dta%ll_u3d ) ALLOCATE( dta_bdy(jbdy)%u3d(nblen(2),jpk) ) 
     761            IF( dta%ll_v3d ) ALLOCATE( dta_bdy(jbdy)%v3d(nblen(3),jpk) ) 
     762         ENDIF 
     763         IF ( nn_dyn3d_dta(jbdy) == 1 .or. & 
     764           &  ( ln_full_vel_array(jbdy) .and. ( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) ) ) THEN 
     765            IF ( dta%ll_u3d .or. ( ln_full_vel_array(jbdy) .and. dta%ll_u2d ) ) THEN 
    759766               if(lwp) write(numout,*) '++++++ dta%u3d pointing to fnow' 
    760767               jfld = jfld + 1 
    761                dta_bdy(ib_bdy)%u3d => bf(jfld)%fnow(:,1,:) 
    762             ENDIF 
    763             IF ( dta%ll_v3d .or. ( ln_full_vel_array(ib_bdy) .and. dta%ll_v2d ) ) THEN 
     768               dta_bdy(jbdy)%u3d => bf(jfld)%fnow(:,1,:) 
     769            ENDIF 
     770            IF ( dta%ll_v3d .or. ( ln_full_vel_array(jbdy) .and. dta%ll_v2d ) ) THEN 
    764771               if(lwp) write(numout,*) '++++++ dta%v3d pointing to fnow' 
    765772               jfld = jfld + 1 
    766                dta_bdy(ib_bdy)%v3d => bf(jfld)%fnow(:,1,:) 
    767             ENDIF 
    768          ENDIF 
    769  
    770          IF( nn_tra_dta(ib_bdy) == 0 ) THEN 
     773               dta_bdy(jbdy)%v3d => bf(jfld)%fnow(:,1,:) 
     774            ENDIF 
     775         ENDIF 
     776 
     777         IF( nn_tra_dta(jbdy) == 0 ) THEN 
    771778            if(lwp) write(numout,*) '++++++ dta%tem/sal allocated space' 
    772             IF( dta%ll_tem ) ALLOCATE( dta_bdy(ib_bdy)%tem(nblen(1),jpk) ) 
    773             IF( dta%ll_sal ) ALLOCATE( dta_bdy(ib_bdy)%sal(nblen(1),jpk) ) 
     779            IF( dta%ll_tem ) ALLOCATE( dta_bdy(jbdy)%tem(nblen(1),jpk) ) 
     780            IF( dta%ll_sal ) ALLOCATE( dta_bdy(jbdy)%sal(nblen(1),jpk) ) 
    774781         ELSE 
    775782            IF( dta%ll_tem ) THEN 
    776783               if(lwp) write(numout,*) '++++++ dta%tem pointing to fnow' 
    777784               jfld = jfld + 1 
    778                dta_bdy(ib_bdy)%tem => bf(jfld)%fnow(:,1,:) 
     785               dta_bdy(jbdy)%tem => bf(jfld)%fnow(:,1,:) 
    779786            ENDIF 
    780787            IF( dta%ll_sal ) THEN  
    781788               if(lwp) write(numout,*) '++++++ dta%sal pointing to fnow' 
    782789               jfld = jfld + 1 
    783                dta_bdy(ib_bdy)%sal => bf(jfld)%fnow(:,1,:) 
    784             ENDIF 
    785          ENDIF 
    786  
    787 #if defined key_lim3 
    788          IF (cn_ice_lim(ib_bdy) /= 'none') THEN 
    789             IF( nn_ice_lim_dta(ib_bdy) == 0 ) THEN 
    790                ALLOCATE( dta_bdy(ib_bdy)%a_i(nblen(1),jpl) ) 
    791                ALLOCATE( dta_bdy(ib_bdy)%h_i(nblen(1),jpl) ) 
    792                ALLOCATE( dta_bdy(ib_bdy)%h_s(nblen(1),jpl) ) 
     790               dta_bdy(jbdy)%sal => bf(jfld)%fnow(:,1,:) 
     791            ENDIF 
     792         ENDIF 
     793 
     794#if defined key_lim3 
     795         IF (cn_ice_lim(jbdy) /= 'none') THEN 
     796            IF( nn_ice_lim_dta(jbdy) == 0 ) THEN 
     797               ALLOCATE( dta_bdy(jbdy)%a_i(nblen(1),jpl) ) 
     798               ALLOCATE( dta_bdy(jbdy)%h_i(nblen(1),jpl) ) 
     799               ALLOCATE( dta_bdy(jbdy)%h_s(nblen(1),jpl) ) 
    793800            ELSE 
    794                IF ( ll_bdylim3 ) THEN ! case input is Xcat 
    795                   jfld = jfld + 1 
    796                   dta_bdy(ib_bdy)%a_i => bf(jfld)%fnow(:,1,:) 
    797                   jfld = jfld + 1 
    798                   dta_bdy(ib_bdy)%h_i => bf(jfld)%fnow(:,1,:) 
    799                   jfld = jfld + 1 
    800                   dta_bdy(ib_bdy)%h_s => bf(jfld)%fnow(:,1,:) 
    801                ELSE ! case input is 1cat 
     801               IF ( nice_cat == jpl ) THEN ! case input cat = jpl 
     802                  jfld = jfld + 1 
     803                  dta_bdy(jbdy)%a_i => bf(jfld)%fnow(:,1,:) 
     804                  jfld = jfld + 1 
     805                  dta_bdy(jbdy)%h_i => bf(jfld)%fnow(:,1,:) 
     806                  jfld = jfld + 1 
     807                  dta_bdy(jbdy)%h_s => bf(jfld)%fnow(:,1,:) 
     808               ELSE                        ! case input cat = 1 OR (/=1 and /=jpl) 
    802809                  jfld_ai  = jfld + 1 
    803810                  jfld_hti = jfld + 2 
    804811                  jfld_hts = jfld + 3 
    805812                  jfld     = jfld + 3 
    806                   ALLOCATE( dta_bdy(ib_bdy)%a_i(nblen(1),jpl) ) 
    807                   ALLOCATE( dta_bdy(ib_bdy)%h_i(nblen(1),jpl) ) 
    808                   ALLOCATE( dta_bdy(ib_bdy)%h_s(nblen(1),jpl) ) 
    809                   dta_bdy(ib_bdy)%a_i(:,:) = 0._wp 
    810                   dta_bdy(ib_bdy)%h_i(:,:) = 0._wp 
    811                   dta_bdy(ib_bdy)%h_s(:,:) = 0._wp 
     813                  ALLOCATE( dta_bdy(jbdy)%a_i(nblen(1),jpl) ) 
     814                  ALLOCATE( dta_bdy(jbdy)%h_i(nblen(1),jpl) ) 
     815                  ALLOCATE( dta_bdy(jbdy)%h_s(nblen(1),jpl) ) 
     816                  dta_bdy(jbdy)%a_i(:,:) = 0._wp 
     817                  dta_bdy(jbdy)%h_i(:,:) = 0._wp 
     818                  dta_bdy(jbdy)%h_s(:,:) = 0._wp 
    812819               ENDIF 
    813820 
     
    816823#endif 
    817824         ! 
    818       END DO ! ib_bdy  
     825      END DO ! jbdy  
    819826      ! 
    820827      IF( nn_timing == 1 ) CALL timing_stop('bdy_dta_init') 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_ice.F90

    r8586 r8813  
    4848   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   alb_ice        !: ice albedo                                       [-] 
    4949 
     50   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qml_ice        !: heat available for snow / ice surface melting     [W/m2]  
     51   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qcn_ice        !: heat conduction flux in the layer below surface   [W/m2]  
     52   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qsr_ice_tr     !: solar flux transmitted below the ice surface      [W/m2] 
     53 
    5054   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   utau_ice       !: atmos-ice u-stress. VP: I-pt ; EVP: U,V-pts   [N/m2] 
    5155   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   vtau_ice       !: atmos-ice v-stress. VP: I-pt ; EVP: U,V-pts   [N/m2] 
    52    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fr1_i0         !: Solar surface transmission parameter, thick ice  [-] 
    53    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fr2_i0         !: Solar surface transmission parameter, thin ice   [-] 
    5456   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   emp_ice        !: sublimation - precip over sea ice          [kg/m2/s] 
    5557 
     
    123125      ALLOCATE( qns_ice (jpi,jpj,jpl) , qsr_ice (jpi,jpj,jpl) ,     & 
    124126         &      qla_ice (jpi,jpj,jpl) , dqla_ice(jpi,jpj,jpl) ,     & 
    125          &      dqns_ice(jpi,jpj,jpl) , tn_ice  (jpi,jpj,jpl) , alb_ice (jpi,jpj,jpl) ,   & 
     127         &      dqns_ice(jpi,jpj,jpl) , tn_ice  (jpi,jpj,jpl)  , alb_ice (jpi,jpj,jpl) ,   & 
     128         &      qml_ice(jpi,jpj,jpl)  , qcn_ice(jpi,jpj,jpl)   , qsr_ice_tr(jpi,jpj,jpl),  & 
    126129         &      utau_ice(jpi,jpj)     , vtau_ice(jpi,jpj)     , wndm_ice(jpi,jpj)     ,   & 
    127          &      fr1_i0  (jpi,jpj)     , fr2_i0  (jpi,jpj)     ,     & 
    128130         &      evap_ice(jpi,jpj,jpl) , devap_ice(jpi,jpj,jpl) , qprec_ice(jpi,jpj) ,   & 
    129131         &      qemp_ice(jpi,jpj)     , qevap_ice(jpi,jpj,jpl) , qemp_oce (jpi,jpj) ,   & 
     
    139141                a_i(jpi,jpj,ncat)     , topmelt(jpi,jpj,ncat) , botmelt(jpi,jpj,ncat) , & 
    140142                STAT= ierr(2) ) 
    141       IF( ln_cpl )   ALLOCATE( u_ice(jpi,jpj)        , fr1_i0(jpi,jpj)       , tn_ice (jpi,jpj,1)    , & 
    142          &                     v_ice(jpi,jpj)        , fr2_i0(jpi,jpj)       , alb_ice(jpi,jpj,1)    , & 
     143      IF( ln_cpl )   ALLOCATE( u_ice(jpi,jpj)        , tn_ice (jpi,jpj,1)    , & 
     144         &                     v_ice(jpi,jpj)        , alb_ice(jpi,jpj,1)    , & 
    143145         &                     emp_ice(jpi,jpj)      , qns_ice(jpi,jpj,1)    , dqns_ice(jpi,jpj,1)   , & 
    144146         &                     STAT= ierr(3) )       
     
    161163   PRIVATE 
    162164 
    163    PUBLIC sbc_ice_alloc 
     165   PUBLIC   sbc_ice_alloc   ! 
    164166 
    165167   LOGICAL         , PUBLIC, PARAMETER ::   lk_lim3    = .FALSE.  !: no LIM-3 ice model 
     
    168170   REAL(wp)        , PUBLIC, PARAMETER ::   cldf_ice = 0.81       !: cloud fraction over sea ice, summer CLIO value   [-] 
    169171   INTEGER         , PUBLIC, PARAMETER ::   jpl = 1  
    170    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   u_ice, v_ice,fr1_i0,fr2_i0          ! jpi, jpj 
     172   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   u_ice, v_ice                        ! jpi, jpj 
    171173   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   tn_ice, alb_ice, qns_ice, dqns_ice  ! (jpi,jpj,jpl) 
    172174   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   a_i 
     
    176178   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   topmelt, botmelt 
    177179   ! 
    178    !! arrays relating to embedding ice in the ocean. These arrays need to be declared  
    179    !! even if no ice model is required. In the no ice model or traditional levitating  
    180    !! ice cases they contain only zeros 
     180   !! arrays related to embedding ice in the ocean.  
     181   !! These arrays need to be declared even if no ice model is required.  
     182   !! In the no ice model or traditional levitating ice cases they contain only zeros 
    181183   !! --------------------- 
    182184   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   snwice_mass        !: mass of snow and ice at current  ice time step   [Kg/m2] 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk.F90

    r8637 r8813  
    1515   !!            3.7  !  2014-06  (L. Brodeau)  simplification and optimization of CORE bulk 
    1616   !!            4.0  !  2016-06  (L. Brodeau)  sbcblk_core becomes sbcblk and is not restricted to the CORE algorithm anymore 
    17    !!                                          ==> based on AeroBulk (http://aerobulk.sourceforge.net/) 
     17   !!                 !                        ==> based on AeroBulk (http://aerobulk.sourceforge.net/) 
    1818   !!            4.0  !  2016-10  (G. Madec)  introduce a sbc_blk_init routine 
     19   !!            4.0  !  2016-10  (M. Vancoppenolle)  Introduce Jules emulator (M. Vancoppenolle)  
    1920   !!---------------------------------------------------------------------- 
    2021 
     
    2324   !!   sbc_blk       : bulk formulation as ocean surface boundary condition 
    2425   !!   blk_oce       : computes momentum, heat and freshwater fluxes over ocean 
    25    !!   blk_ice       : computes momentum, heat and freshwater fluxes over sea ice 
    2626   !!   rho_air       : density of (moist) air (depends on T_air, q_air and SLP 
    2727   !!   cp_air        : specific heat of (moist) air (depends spec. hum. q_air) 
    2828   !!   q_sat         : saturation humidity as a function of SLP and temperature 
    2929   !!   L_vap         : latent heat of vaporization of water as a function of temperature 
     30   !!             sea-ice case only :  
     31   !!   blk_ice_tau   : provide the air-ice stress 
     32   !!   blk_ice_flx   : provide the heat and mass fluxes at air-ice interface 
     33   !!   blk_ice_qcn   : provide ice surface temperature and snow/ice conduction flux (emulating JULES coupler) 
     34   !!   Cdn10_Lupkes2012 : Lupkes et al. (2012) air-ice drag 
     35   !!   Cdn10_Lupkes2015 : Lupkes et al. (2015) air-ice drag  
    3036   !!---------------------------------------------------------------------- 
    3137   USE oce            ! ocean dynamics and tracers 
     
    4248   USE ice     , ONLY :   u_ice, v_ice, jpl, a_i_b, at_i_b, tm_su 
    4349   USE icethd_dh      ! for CALL ice_thd_snwblow 
     50   USE icethd_zdf,ONLY:   rn_cnd_s  ! for blk_ice_qcn 
    4451#endif 
    4552   USE sbcblk_algo_ncar     ! => turb_ncar     : NCAR - CORE (Large & Yeager, 2009)  
     
    6370   PUBLIC   blk_ice_tau   ! routine called in icestp module 
    6471   PUBLIC   blk_ice_flx   ! routine called in icestp module 
    65 #endif 
     72   PUBLIC   blk_ice_qcn   ! routine called in icestp module 
     73#endif  
    6674 
    6775!!Lolo: should ultimately be moved in the module with all physical constants ? 
     
    111119   LOGICAL  ::   ln_Cd_L15 = .FALSE. !  Modify the drag ice-atm depending on ice concentration (from Lupkes et al. JGR2015) 
    112120   ! 
    113 !!cr   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   Cd_oce   ! air-ocean drag (clem) 
    114121   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   Cd_atm                    ! transfer coefficient for momentum      (tau) 
    115122   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   Ch_atm                    ! transfer coefficient for sensible heat (Q_sens) 
     
    139146      !!             ***  ROUTINE sbc_blk_alloc *** 
    140147      !!------------------------------------------------------------------- 
    141 !!cr      ALLOCATE( Cd_oce(jpi,jpj) , STAT=sbc_blk_alloc ) 
    142148      ALLOCATE( Cd_atm (jpi,jpj), Ch_atm (jpi,jpj), Ce_atm (jpi,jpj), t_zu(jpi,jpj), q_zu(jpi,jpj), & 
    143149         &      cdn_oce(jpi,jpj), chn_oce(jpi,jpj), cen_oce(jpi,jpj), STAT=sbc_blk_alloc ) 
     
    147153   END FUNCTION sbc_blk_alloc 
    148154 
     155 
    149156   SUBROUTINE sbc_blk_init 
    150157      !!--------------------------------------------------------------------- 
     
    154161      !! 
    155162      !! ** Method  :  
    156       !! 
    157       !!      C A U T I O N : never mask the surface stress fields 
    158       !!                      the stress is assumed to be in the (i,j) mesh referential 
    159       !! 
    160       !! ** Action  :    
    161163      !! 
    162164      !!---------------------------------------------------------------------- 
     
    285287      !! 
    286288      !! ** Purpose :   provide at each time step the surface ocean fluxes 
    287       !!      (momentum, heat, freshwater and runoff) 
     289      !!              (momentum, heat, freshwater and runoff) 
    288290      !! 
    289291      !! ** Method  : (1) READ each fluxes in NetCDF files: 
     
    566568   END SUBROUTINE blk_oce 
    567569 
     570 
     571 
     572   FUNCTION rho_air( ptak, pqa, pslp ) 
     573      !!------------------------------------------------------------------------------- 
     574      !!                           ***  FUNCTION rho_air  *** 
     575      !! 
     576      !! ** Purpose : compute density of (moist) air using the eq. of state of the atmosphere 
     577      !! 
     578      !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk)  
     579      !!------------------------------------------------------------------------------- 
     580      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   ptak      ! air temperature             [K] 
     581      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pqa       ! air specific humidity   [kg/kg] 
     582      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pslp      ! pressure in                [Pa] 
     583      REAL(wp), DIMENSION(jpi,jpj)             ::   rho_air   ! density of moist air   [kg/m^3] 
     584      !!------------------------------------------------------------------------------- 
     585      ! 
     586      rho_air = pslp / (  R_dry*ptak * ( 1._wp + rctv0*pqa )  ) 
     587      ! 
     588   END FUNCTION rho_air 
     589 
     590 
     591   FUNCTION cp_air( pqa ) 
     592      !!------------------------------------------------------------------------------- 
     593      !!                           ***  FUNCTION cp_air  *** 
     594      !! 
     595      !! ** Purpose : Compute specific heat (Cp) of moist air 
     596      !! 
     597      !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 
     598      !!------------------------------------------------------------------------------- 
     599      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pqa      ! air specific humidity         [kg/kg] 
     600      REAL(wp), DIMENSION(jpi,jpj)             ::   cp_air   ! specific heat of moist air   [J/K/kg] 
     601      !!------------------------------------------------------------------------------- 
     602      ! 
     603      Cp_air = Cp_dry + Cp_vap * pqa 
     604      ! 
     605   END FUNCTION cp_air 
     606 
     607 
     608   FUNCTION q_sat( ptak, pslp ) 
     609      !!---------------------------------------------------------------------------------- 
     610      !!                           ***  FUNCTION q_sat  *** 
     611      !! 
     612      !! ** Purpose : Specific humidity at saturation in [kg/kg] 
     613      !!              Based on accurate estimate of "e_sat" 
     614      !!              aka saturation water vapor (Goff, 1957) 
     615      !! 
     616      !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 
     617      !!---------------------------------------------------------------------------------- 
     618      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   ptak    ! air temperature                       [K] 
     619      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pslp    ! sea level atmospheric pressure       [Pa] 
     620      REAL(wp), DIMENSION(jpi,jpj)             ::   q_sat   ! Specific humidity at saturation   [kg/kg] 
     621      ! 
     622      INTEGER  ::   ji, jj         ! dummy loop indices 
     623      REAL(wp) ::   ze_sat, ztmp   ! local scalar 
     624      !!---------------------------------------------------------------------------------- 
     625      ! 
     626      DO jj = 1, jpj 
     627         DO ji = 1, jpi 
     628            ! 
     629            ztmp = rt0 / ptak(ji,jj) 
     630            ! 
     631            ! Vapour pressure at saturation [hPa] : WMO, (Goff, 1957) 
     632            ze_sat = 10.**( 10.79574*(1. - ztmp) - 5.028*LOG10(ptak(ji,jj)/rt0)        & 
     633               &    + 1.50475*10.**(-4)*(1. - 10.**(-8.2969*(ptak(ji,jj)/rt0 - 1.)) )  & 
     634               &    + 0.42873*10.**(-3)*(10.**(4.76955*(1. - ztmp)) - 1.) + 0.78614  ) 
     635               ! 
     636            q_sat(ji,jj) = reps0 * ze_sat/( 0.01_wp*pslp(ji,jj) - (1._wp - reps0)*ze_sat )   ! 0.01 because SLP is in [Pa] 
     637            ! 
     638         END DO 
     639      END DO 
     640      ! 
     641   END FUNCTION q_sat 
     642 
     643 
     644   FUNCTION gamma_moist( ptak, pqa ) 
     645      !!---------------------------------------------------------------------------------- 
     646      !!                           ***  FUNCTION gamma_moist  *** 
     647      !! 
     648      !! ** Purpose : Compute the moist adiabatic lapse-rate. 
     649      !!     => http://glossary.ametsoc.org/wiki/Moist-adiabatic_lapse_rate 
     650      !!     => http://www.geog.ucsb.edu/~joel/g266_s10/lecture_notes/chapt03/oh10_3_01/oh10_3_01.html 
     651      !! 
     652      !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 
     653      !!---------------------------------------------------------------------------------- 
     654      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   ptak          ! air temperature       [K] 
     655      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pqa           ! specific humidity [kg/kg] 
     656      REAL(wp), DIMENSION(jpi,jpj)             ::   gamma_moist   ! moist adiabatic lapse-rate 
     657      ! 
     658      INTEGER  ::   ji, jj         ! dummy loop indices 
     659      REAL(wp) :: zrv, ziRT        ! local scalar 
     660      !!---------------------------------------------------------------------------------- 
     661      ! 
     662      DO jj = 1, jpj 
     663         DO ji = 1, jpi 
     664            zrv = pqa(ji,jj) / (1. - pqa(ji,jj)) 
     665            ziRT = 1. / (R_dry*ptak(ji,jj))    ! 1/RT 
     666            gamma_moist(ji,jj) = grav * ( 1. + cevap*zrv*ziRT ) / ( Cp_dry + cevap*cevap*zrv*reps0*ziRT/ptak(ji,jj) ) 
     667         END DO 
     668      END DO 
     669      ! 
     670   END FUNCTION gamma_moist 
     671 
     672 
     673   FUNCTION L_vap( psst ) 
     674      !!--------------------------------------------------------------------------------- 
     675      !!                           ***  FUNCTION L_vap  *** 
     676      !! 
     677      !! ** Purpose : Compute the latent heat of vaporization of water from temperature 
     678      !! 
     679      !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 
     680      !!---------------------------------------------------------------------------------- 
     681      REAL(wp), DIMENSION(jpi,jpj)             ::   L_vap   ! latent heat of vaporization   [J/kg] 
     682      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   psst   ! water temperature                [K] 
     683      !!---------------------------------------------------------------------------------- 
     684      ! 
     685      L_vap = (  2.501 - 0.00237 * ( psst(:,:) - rt0)  ) * 1.e6 
     686      ! 
     687   END FUNCTION L_vap 
     688 
    568689#if defined key_lim3 
     690   !!---------------------------------------------------------------------- 
     691   !!   'key_lim3'                                       ESIM sea-ice model 
     692   !!---------------------------------------------------------------------- 
     693   !!   blk_ice_tau : provide the air-ice stress 
     694   !!   blk_ice_flx : provide the heat and mass fluxes at air-ice interface 
     695   !!   blk_ice_qcn : provide ice surface temperature and snow/ice conduction flux (emulating JULES coupler) 
     696   !!   Cdn10_Lupkes2012 : Lupkes et al. (2012) air-ice drag 
     697   !!   Cdn10_Lupkes2015 : Lupkes et al. (2015) air-ice drag  
     698   !!---------------------------------------------------------------------- 
    569699 
    570700   SUBROUTINE blk_ice_tau 
     
    688818 
    689819 
    690    SUBROUTINE blk_ice_flx( ptsu, palb ) 
     820   SUBROUTINE blk_ice_flx( ptsu, phs, phi, palb ) 
    691821      !!--------------------------------------------------------------------- 
    692822      !!                     ***  ROUTINE blk_ice_flx  *** 
    693823      !! 
    694       !! ** Purpose :   provide the surface boundary condition over sea-ice 
     824      !! ** Purpose :   provide the heat and mass fluxes at air-ice interface 
    695825      !! 
    696826      !! ** Method  :   compute heat and freshwater exchanged 
     
    701831      !!--------------------------------------------------------------------- 
    702832      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   ptsu   ! sea ice surface temperature 
     833      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   phs    ! snow thickness 
     834      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   phi    ! ice thickness 
    703835      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   palb   ! ice albedo (all skies) 
    704836      !! 
     
    707839      REAL(wp) ::   zcoef_dqlw, zcoef_dqla   !   -      - 
    708840      REAL(wp) ::   zztmp, z1_lsub           !   -      - 
     841      REAL(wp) ::   zfrqsr_tr_i              ! sea ice shortwave fraction transmitted below through the ice 
     842      REAL(wp) ::   zfr1, zfr2, zfac         ! local variables 
    709843      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   z_qlw         ! long wave heat flux over ice 
    710844      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   z_qsb         ! sensible  heat flux over ice 
     
    717851      IF( ln_timing )   CALL timing_start('blk_ice_flx') 
    718852      ! 
    719       ! 
    720       ! local scalars 
    721       zcoef_dqlw   = 4.0 * 0.95 * Stef 
    722       zcoef_dqla   = -Ls * 11637800. * (-5897.8) 
     853      zcoef_dqlw = 4.0 * 0.95 * Stef             ! local scalars 
     854      zcoef_dqla = -Ls * 11637800. * (-5897.8) 
    723855      ! 
    724856      zrhoa(:,:) = rho_air( sf(jp_tair)%fnow(:,:,1), sf(jp_humi)%fnow(:,:,1), sf(jp_slp)%fnow(:,:,1) ) 
     
    815947      END DO 
    816948 
    817       !-------------------------------------------------------------------- 
    818       ! FRACTIONs of net shortwave radiation which is not absorbed in the 
    819       ! thin surface layer and penetrates inside the ice cover 
    820       ! ( Maykut and Untersteiner, 1971 ; Ebert and Curry, 1993 ) 
    821       ! 
    822       fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 
    823       fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 
     949      ! --- absorbed and transmitted shortwave radiation (W/m2) --- ! 
     950      ! 
     951      ! former coding was 
     952      !     fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 
     953      !     fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 
     954 
     955      ! --- surface transmission parameter (i0, Grenfell Maykut 77) --- ! 
     956      zfr1 = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice )            !   standard value 
     957      zfr2 = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice )            !   zfr2 such that zfr1 + zfr2 to equal 1 
     958 
     959      qsr_ice_tr(:,:,:) = 0._wp 
     960 
     961      DO jl = 1, jpl 
     962         DO jj = 1, jpj 
     963            DO ji = 1, jpi 
     964               ! 
     965               zfac = MAX( 0._wp , 1._wp - phi(ji,jj,jl) * 10._wp )     !   linear weighting factor: =0 for phi=0, =1 for phi = 0.1 
     966               zfrqsr_tr_i = zfr1 + zfac * zfr2                         !   below 10 cm, linearly increase zfrqsr_tr_i until 1 at zero thickness 
     967               ! 
     968               IF ( phs(ji,jj,jl) <= 0._wp ) THEN   ;    zfrqsr_tr_i  = zfr1 + zfac * zfr2 
     969               ELSE                                 ;    zfrqsr_tr_i  = 0._wp                                  !   snow fully opaque 
     970               ENDIF 
     971               ! 
     972               qsr_ice_tr(ji,jj,jl) = zfrqsr_tr_i * qsr_ice(ji,jj,jl)   !   transmitted solar radiation  
     973               ! 
     974            END DO 
     975         END DO 
     976      END DO 
    824977      ! 
    825978      IF(ln_ctl) THEN 
     
    836989   END SUBROUTINE blk_ice_flx 
    837990    
    838 #endif 
    839  
    840    FUNCTION rho_air( ptak, pqa, pslp ) 
    841       !!------------------------------------------------------------------------------- 
    842       !!                           ***  FUNCTION rho_air  *** 
    843       !! 
    844       !! ** Purpose : compute density of (moist) air using the eq. of state of the atmosphere 
    845       !! 
    846       !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk)  
    847       !!------------------------------------------------------------------------------- 
    848       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   ptak      ! air temperature             [K] 
    849       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pqa       ! air specific humidity   [kg/kg] 
    850       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pslp      ! pressure in                [Pa] 
    851       REAL(wp), DIMENSION(jpi,jpj)             ::   rho_air   ! density of moist air   [kg/m^3] 
    852       !!------------------------------------------------------------------------------- 
    853       ! 
    854       rho_air = pslp / (  R_dry*ptak * ( 1._wp + rctv0*pqa )  ) 
    855       ! 
    856    END FUNCTION rho_air 
    857  
    858  
    859    FUNCTION cp_air( pqa ) 
    860       !!------------------------------------------------------------------------------- 
    861       !!                           ***  FUNCTION cp_air  *** 
    862       !! 
    863       !! ** Purpose : Compute specific heat (Cp) of moist air 
    864       !! 
    865       !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 
    866       !!------------------------------------------------------------------------------- 
    867       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pqa      ! air specific humidity         [kg/kg] 
    868       REAL(wp), DIMENSION(jpi,jpj)             ::   cp_air   ! specific heat of moist air   [J/K/kg] 
    869       !!------------------------------------------------------------------------------- 
    870       ! 
    871       Cp_air = Cp_dry + Cp_vap * pqa 
    872       ! 
    873    END FUNCTION cp_air 
    874  
    875  
    876    FUNCTION q_sat( ptak, pslp ) 
    877       !!---------------------------------------------------------------------------------- 
    878       !!                           ***  FUNCTION q_sat  *** 
    879       !! 
    880       !! ** Purpose : Specific humidity at saturation in [kg/kg] 
    881       !!              Based on accurate estimate of "e_sat" 
    882       !!              aka saturation water vapor (Goff, 1957) 
    883       !! 
    884       !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 
    885       !!---------------------------------------------------------------------------------- 
    886       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   ptak    ! air temperature                       [K] 
    887       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pslp    ! sea level atmospheric pressure       [Pa] 
    888       REAL(wp), DIMENSION(jpi,jpj)             ::   q_sat   ! Specific humidity at saturation   [kg/kg] 
    889       ! 
    890       INTEGER  ::   ji, jj         ! dummy loop indices 
    891       REAL(wp) ::   ze_sat, ztmp   ! local scalar 
    892       !!---------------------------------------------------------------------------------- 
    893       ! 
    894       DO jj = 1, jpj 
    895          DO ji = 1, jpi 
    896             ! 
    897             ztmp = rt0 / ptak(ji,jj) 
    898             ! 
    899             ! Vapour pressure at saturation [hPa] : WMO, (Goff, 1957) 
    900             ze_sat = 10.**( 10.79574*(1. - ztmp) - 5.028*LOG10(ptak(ji,jj)/rt0)        & 
    901                &    + 1.50475*10.**(-4)*(1. - 10.**(-8.2969*(ptak(ji,jj)/rt0 - 1.)) )  & 
    902                &    + 0.42873*10.**(-3)*(10.**(4.76955*(1. - ztmp)) - 1.) + 0.78614  ) 
     991 
     992   SUBROUTINE blk_ice_qcn( k_monocat, ptsu, ptb, phs, phi ) 
     993      !!--------------------------------------------------------------------- 
     994      !!                     ***  ROUTINE blk_ice_qcn  *** 
     995      !! 
     996      !! ** Purpose :   Compute surface temperature and snow/ice conduction flux 
     997      !!                to force sea ice / snow thermodynamics 
     998      !!                in the case JULES coupler is emulated 
     999      !!                 
     1000      !! ** Method  :   compute surface energy balance assuming neglecting heat storage 
     1001      !!                following the 0-layer Semtner (1976) approach 
     1002      !! 
     1003      !! ** Outputs : - ptsu    : sea-ice / snow surface temperature (K) 
     1004      !!              - qcn_ice : surface inner conduction flux (W/m2) 
     1005      !! 
     1006      !!--------------------------------------------------------------------- 
     1007      INTEGER                   , INTENT(in   ) ::   k_monocat   ! single-category option 
     1008      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptsu        ! sea ice / snow surface temperature 
     1009      REAL(wp), DIMENSION(:,:)  , INTENT(in   ) ::   ptb         ! sea ice base temperature 
     1010      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   phs         ! snow thickness 
     1011      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   phi         ! sea ice thickness 
     1012      ! 
     1013      INTEGER , PARAMETER ::   nit = 10                  ! number of iterations 
     1014      REAL(wp), PARAMETER ::   zepsilon = 0.1_wp         ! characteristic thickness for enhanced conduction 
     1015      ! 
     1016      INTEGER  ::   ji, jj, jl           ! dummy loop indices 
     1017      INTEGER  ::   iter                 ! local integer 
     1018      REAL(wp) ::   zfac, zfac2, zfac3   ! local scalars 
     1019      REAL(wp) ::   zkeff_h, ztsu        ! 
     1020      REAL(wp) ::   zqc, zqnet           ! 
     1021      REAL(wp) ::   zhe, zqa0            ! 
     1022      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zgfac   ! enhanced conduction factor 
     1023      !!--------------------------------------------------------------------- 
     1024 
     1025      IF( nn_timing == 1 )  CALL timing_start('blk_ice_qcn') 
     1026       
     1027      ! -------------------------------------! 
     1028      !      I   Enhanced conduction factor  ! 
     1029      ! -------------------------------------! 
     1030      ! Emulates the enhancement of conduction by unresolved thin ice (k_monocat = 1/3) 
     1031      ! Fichefet and Morales Maqueda, JGR 1997 
     1032      ! 
     1033      zgfac(:,:,:) = 1._wp 
     1034       
     1035      SELECT CASE ( k_monocat )  
     1036      ! 
     1037      CASE ( 1 , 3 ) 
     1038         ! 
     1039         zfac    =   1._wp /  ( rn_cnd_s + rcdic ) 
     1040         zfac2   =   EXP(1._wp) * 0.5_wp * zepsilon 
     1041         zfac3   =   2._wp / zepsilon 
     1042         !    
     1043         DO jl = 1, jpl                 
     1044            DO jj = 1 , jpj 
     1045               DO ji = 1, jpi 
     1046                  !                                ! Effective thickness 
     1047                  zhe               =   ( rn_cnd_s * phi(ji,jj,jl) + rcdic * phs(ji,jj,jl) ) * zfac 
     1048                  !                                ! Enhanced conduction factor 
     1049                  IF( zhe >=  zfac2 )  & 
     1050                     zgfac(ji,jj,jl)   =   MIN( 2._wp, ( 0.5_wp + 0.5 * LOG( zhe * zfac3 ) ) ) 
     1051               END DO 
     1052            END DO 
     1053         END DO 
     1054         !       
     1055      END SELECT 
     1056       
     1057      ! -------------------------------------------------------------! 
     1058      !      II   Surface temperature and conduction flux            ! 
     1059      ! -------------------------------------------------------------! 
     1060      ! 
     1061      zfac   =   rcdic * rn_cnd_s  
     1062      !                             ! ========================== ! 
     1063      DO jl = 1, jpl                !  Loop over ice categories  ! 
     1064         !                          ! ========================== ! 
     1065         DO jj = 1 , jpj 
     1066            DO ji = 1, jpi 
     1067               !                    ! Effective conductivity of the snow-ice system divided by thickness 
     1068               zkeff_h =   zfac * zgfac(ji,jj,jl) / ( rcdic * phs(ji,jj,jl) + rn_cnd_s * phi(ji,jj,jl) ) 
     1069               !                    ! Store initial surface temperature 
     1070               ztsu    =   ptsu(ji,jj,jl) 
     1071               !                    ! Net initial atmospheric heat flux 
     1072               zqa0    =   qsr_ice(ji,jj,jl) - qsr_ice_tr(ji,jj,jl) + qns_ice(ji,jj,jl) 
    9031073               ! 
    904             q_sat(ji,jj) = reps0 * ze_sat/( 0.01_wp*pslp(ji,jj) - (1._wp - reps0)*ze_sat )   ! 0.01 because SLP is in [Pa] 
    905             ! 
    906          END DO 
    907       END DO 
    908       ! 
    909    END FUNCTION q_sat 
    910  
    911  
    912    FUNCTION gamma_moist( ptak, pqa ) 
    913       !!---------------------------------------------------------------------------------- 
    914       !!                           ***  FUNCTION gamma_moist  *** 
    915       !! 
    916       !! ** Purpose : Compute the moist adiabatic lapse-rate. 
    917       !!     => http://glossary.ametsoc.org/wiki/Moist-adiabatic_lapse_rate 
    918       !!     => http://www.geog.ucsb.edu/~joel/g266_s10/lecture_notes/chapt03/oh10_3_01/oh10_3_01.html 
    919       !! 
    920       !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 
    921       !!---------------------------------------------------------------------------------- 
    922       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   ptak          ! air temperature       [K] 
    923       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pqa           ! specific humidity [kg/kg] 
    924       REAL(wp), DIMENSION(jpi,jpj)             ::   gamma_moist   ! moist adiabatic lapse-rate 
    925       ! 
    926       INTEGER  ::   ji, jj         ! dummy loop indices 
    927       REAL(wp) :: zrv, ziRT        ! local scalar 
    928       !!---------------------------------------------------------------------------------- 
    929       ! 
    930       DO jj = 1, jpj 
    931          DO ji = 1, jpi 
    932             zrv = pqa(ji,jj) / (1. - pqa(ji,jj)) 
    933             ziRT = 1. / (R_dry*ptak(ji,jj))    ! 1/RT 
    934             gamma_moist(ji,jj) = grav * ( 1. + cevap*zrv*ziRT ) / ( Cp_dry + cevap*cevap*zrv*reps0*ziRT/ptak(ji,jj) ) 
    935          END DO 
    936       END DO 
    937       ! 
    938    END FUNCTION gamma_moist 
    939  
    940  
    941    FUNCTION L_vap( psst ) 
    942       !!--------------------------------------------------------------------------------- 
    943       !!                           ***  FUNCTION L_vap  *** 
    944       !! 
    945       !! ** Purpose : Compute the latent heat of vaporization of water from temperature 
    946       !! 
    947       !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 
    948       !!---------------------------------------------------------------------------------- 
    949       REAL(wp), DIMENSION(jpi,jpj)             ::   L_vap   ! latent heat of vaporization   [J/kg] 
    950       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   psst   ! water temperature                [K] 
    951       !!---------------------------------------------------------------------------------- 
    952       ! 
    953       L_vap = (  2.501 - 0.00237 * ( psst(:,:) - rt0)  ) * 1.e6 
    954       ! 
    955    END FUNCTION L_vap 
    956  
    957 #if defined key_lim3 
     1074               DO iter = 1, nit     ! --- Iteration loop 
     1075                   !                      ! Conduction heat flux through snow-ice system (>0 downwards) 
     1076                   zqc   =   zkeff_h * ( ztsu - ptb(ji,jj) ) 
     1077                   !                      ! Surface energy budget 
     1078                   zqnet =   zqa0 + dqns_ice(ji,jj,jl) * ( ztsu - ptsu(ji,jj,jl) ) - zqc 
     1079                   !                      ! Temperature update 
     1080                   ztsu  =   ztsu - zqnet / ( dqns_ice(ji,jj,jl) - zkeff_h ) 
     1081               END DO 
     1082               ! 
     1083               ptsu   (ji,jj,jl) = MIN( rt0, ztsu ) 
     1084               qcn_ice(ji,jj,jl) = zkeff_h * ( ptsu(ji,jj,jl) - ptb(ji,jj) ) 
     1085               ! 
     1086            END DO 
     1087         END DO 
     1088         ! 
     1089      END DO  
     1090      !       
     1091      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_qcn') 
     1092      ! 
     1093   END SUBROUTINE blk_ice_qcn 
     1094    
    9581095 
    9591096   SUBROUTINE Cdn10_Lupkes2012( Cd ) 
     
    9611098      !!                      ***  ROUTINE  Cdn10_Lupkes2012  *** 
    9621099      !! 
    963       !! ** Purpose :    Recompute the ice-atm drag at 10m height to make 
    964       !!                 it dependent on edges at leads, melt ponds and flows. 
     1100      !! ** Purpose :    Recompute the neutral air-ice drag referenced at 10m  
     1101      !!                 to make it dependent on edges at leads, melt ponds and flows. 
    9651102      !!                 After some approximations, this can be resumed to a dependency 
    9661103      !!                 on ice concentration. 
     
    10121149      !!                      ***  ROUTINE  Cdn10_Lupkes2015  *** 
    10131150      !! 
    1014       !! ** pUrpose :    1lternative turbulent transfert coefficients formulation 
     1151      !! ** pUrpose :    Alternative turbulent transfert coefficients formulation 
    10151152      !!                 between sea-ice and atmosphere with distinct momentum  
    10161153      !!                 and heat coefficients depending on sea-ice concentration  
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_algo_coare.F90

    r8637 r8813  
    4949   PUBLIC ::   TURB_COARE   ! called by sbcblk.F90 
    5050 
    51    !                                           !! COARE own values for given constants: 
    52    REAL(wp), PARAMETER ::   zi0     = 600.      ! scale height of the atmospheric boundary layer...1 
    53    REAL(wp), PARAMETER ::   Beta0   =   1.25    ! gustiness parameter 
    54    REAL(wp), PARAMETER ::   rctv0   =   0.608   ! constant to obtain virtual temperature... 
     51   !                                              !! COARE own values for given constants: 
     52   REAL(wp), PARAMETER ::   zi0     = 600._wp      ! scale height of the atmospheric boundary layer... 
     53   REAL(wp), PARAMETER ::   Beta0   =   1.250_wp   ! gustiness parameter 
     54   REAL(wp), PARAMETER ::   rctv0   =   0.608_wp   ! constant to obtain virtual temperature... 
    5555 
    5656   !!---------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90

    r8637 r8813  
    971971      !!                        emp          upward mass flux [evap. - precip. (- runoffs) (- calving)] (ocean only case) 
    972972      !!---------------------------------------------------------------------- 
    973       USE zdf_oce,  ONLY : ln_zdfswm 
    974  
    975       IMPLICIT NONE 
    976  
    977       INTEGER, INTENT(in)           ::   kt          ! ocean model time step index 
    978       INTEGER, INTENT(in)           ::   k_fsbc      ! frequency of sbc (-> ice model) computation  
    979       INTEGER, INTENT(in)           ::   k_ice       ! ice management in the sbc (=0/1/2/3) 
     973      USE zdf_oce,  ONLY :   ln_zdfswm 
     974      ! 
     975      INTEGER, INTENT(in) ::   kt          ! ocean model time step index 
     976      INTEGER, INTENT(in) ::   k_fsbc      ! frequency of sbc (-> ice model) computation  
     977      INTEGER, INTENT(in) ::   k_ice       ! ice management in the sbc (=0/1/2/3) 
    980978      !! 
    981979      LOGICAL  ::   llnewtx, llnewtau      ! update wind stress components and module?? 
     
    11701168         ! Calculate the 3D Stokes drift both in coupled and not fully uncoupled mode 
    11711169         IF( srcv(jpr_sdrftx)%laction .OR. srcv(jpr_sdrfty)%laction .OR. srcv(jpr_wper)%laction & 
    1172                                                                     .OR. srcv(jpr_hsig)%laction ) THEN 
     1170            &                                                       .OR. srcv(jpr_hsig)%laction ) THEN 
    11731171            CALL sbc_stokes() 
    11741172         ENDIF 
     
    15251523    
    15261524 
    1527    SUBROUTINE sbc_cpl_ice_flx( picefr, palbi, psst, pist ) 
     1525   SUBROUTINE sbc_cpl_ice_flx( picefr, palbi, psst, pist, phs, phi ) 
    15281526      !!---------------------------------------------------------------------- 
    15291527      !!             ***  ROUTINE sbc_cpl_ice_flx  *** 
     
    15761574      !!---------------------------------------------------------------------- 
    15771575      REAL(wp), INTENT(in), DIMENSION(:,:)             ::   picefr     ! ice fraction                [0 to 1] 
    1578       ! optional arguments, used only in 'mixed oce-ice' case 
     1576      !                                                !!           ! optional arguments, used only in 'mixed oce-ice' case 
    15791577      REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL ::   palbi      ! all skies ice albedo  
    15801578      REAL(wp), INTENT(in), DIMENSION(:,:  ), OPTIONAL ::   psst       ! sea surface temperature     [Celsius] 
    15811579      REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL ::   pist       ! ice surface temperature     [Kelvin] 
    1582       ! 
    1583       INTEGER ::   jl         ! dummy loop index 
    1584       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zcptn, zcptrain, zcptsnw, ziceld, zmsk, zsnw 
    1585       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip, zevap_oce, zevap_ice, zdevap_ice 
    1586       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice 
    1587       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice 
     1580      REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL ::   phs        ! snow depth                  [m] 
     1581      REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL ::   phi        ! ice thickness               [m] 
     1582      ! 
     1583      INTEGER  ::   ji, jj, jl   ! dummy loop index 
     1584      REAL(wp) ::   ztri         ! local scalar 
     1585      REAL(wp), DIMENSION(jpi,jpj)     ::   zcptn, zcptrain, zcptsnw, ziceld, zmsk, zsnw 
     1586      REAL(wp), DIMENSION(jpi,jpj)     ::   zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip  , zevap_oce, zevap_ice, zdevap_ice 
     1587      REAL(wp), DIMENSION(jpi,jpj)     ::   zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice 
     1588      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice    !!gm , zfrqsr_tr_i 
    15881589      !!---------------------------------------------------------------------- 
    15891590      ! 
    15901591      IF( nn_timing == 1 )  CALL timing_start('sbc_cpl_ice_flx') 
    15911592      ! 
    1592       CALL wrk_alloc( jpi,jpj,     zcptn, zcptrain, zcptsnw, ziceld, zmsk, zsnw ) 
    1593       CALL wrk_alloc( jpi,jpj,     zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip, zevap_oce, zevap_ice, zdevap_ice ) 
    1594       CALL wrk_alloc( jpi,jpj,     zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice ) 
    1595       CALL wrk_alloc( jpi,jpj,jpl, zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice ) 
    1596  
    15971593      IF( ln_mixcpl )   zmsk(:,:) = 1. - xcplmask(:,:,0) 
    1598       ziceld(:,:) = 1. - picefr(:,:) 
    1599       zcptn(:,:) = rcp * sst_m(:,:) 
     1594      ziceld(:,:) = 1._wp - picefr(:,:) 
     1595      zcptn (:,:) = rcp * sst_m(:,:) 
    16001596      ! 
    16011597      !                                                      ! ========================= ! 
     
    16221618#if defined key_lim3 
    16231619      ! zsnw = snow fraction over ice after wind blowing (=picefr if no blowing) 
    1624       zsnw(:,:) = 0._wp  ;  CALL ice_thd_snwblow( ziceld, zsnw ) 
     1620      zsnw(:,:) = 0._wp   ;   CALL ice_thd_snwblow( ziceld, zsnw ) 
    16251621       
    16261622      ! --- evaporation minus precipitation corrected (because of wind blowing on snow) --- ! 
     
    16591655         sprecip(:,:) = sprecip(:,:) * xcplmask(:,:,0) + zsprecip(:,:) * zmsk(:,:) 
    16601656         tprecip(:,:) = tprecip(:,:) * xcplmask(:,:,0) + ztprecip(:,:) * zmsk(:,:) 
    1661          DO jl=1,jpl 
     1657         DO jl = 1, jpl 
    16621658            evap_ice (:,:,jl) = evap_ice (:,:,jl) * xcplmask(:,:,0) + zevap_ice (:,:) * zmsk(:,:) 
    16631659            devap_ice(:,:,jl) = devap_ice(:,:,jl) * xcplmask(:,:,0) + zdevap_ice(:,:) * zmsk(:,:) 
    1664          ENDDO 
     1660         END DO 
    16651661      ELSE 
    1666          emp_tot(:,:) =         zemp_tot(:,:) 
    1667          emp_ice(:,:) =         zemp_ice(:,:) 
    1668          emp_oce(:,:) =         zemp_oce(:,:)      
    1669          sprecip(:,:) =         zsprecip(:,:) 
    1670          tprecip(:,:) =         ztprecip(:,:) 
    1671          DO jl=1,jpl 
     1662         emp_tot(:,:) = zemp_tot(:,:) 
     1663         emp_ice(:,:) = zemp_ice(:,:) 
     1664         emp_oce(:,:) = zemp_oce(:,:)      
     1665         sprecip(:,:) = zsprecip(:,:) 
     1666         tprecip(:,:) = ztprecip(:,:) 
     1667         DO jl = 1, jpl 
    16721668            evap_ice (:,:,jl) = zevap_ice (:,:) 
    16731669            devap_ice(:,:,jl) = zdevap_ice(:,:) 
    1674          ENDDO 
     1670         END DO 
    16751671      ENDIF 
    16761672 
     
    16911687        fwfisf(:,:) = - frcv(jpr_isf)%z3(:,:,1) 
    16921688      ENDIF 
    1693  
     1689      ! 
    16941690      IF( ln_mixcpl ) THEN 
    16951691         emp_tot(:,:) = emp_tot(:,:) * xcplmask(:,:,0) + zemp_tot(:,:) * zmsk(:,:) 
     
    17031699         tprecip(:,:) =                                  ztprecip(:,:) 
    17041700      ENDIF 
    1705  
     1701      ! 
    17061702#endif 
     1703 
    17071704      ! outputs 
    17081705!!      IF( srcv(jpr_rnf)%laction )   CALL iom_put( 'runoffs' , rnf(:,:) * tmask(:,:,1)                                 )  ! runoff 
     
    17301727            zqns_ice(:,:,1:jpl) = frcv(jpr_qnsice)%z3(:,:,1:jpl) 
    17311728         ELSE 
    1732             DO jl=1,jpl 
     1729            DO jl = 1, jpl 
    17331730               zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) ! Set all category values equal 
    1734             ENDDO 
     1731            END DO 
    17351732         ENDIF 
    17361733      CASE( 'oce and ice' )      ! the total flux is computed from ocean and ice fluxes 
     
    17431740         ELSE 
    17441741            qns_tot(:,:) = qns_tot(:,:) + picefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 
    1745             DO jl=1,jpl 
     1742            DO jl = 1, jpl 
    17461743               zqns_tot(:,:   ) = zqns_tot(:,:) + picefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 
    17471744               zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) 
    1748             ENDDO 
     1745            END DO 
    17491746         ENDIF 
    17501747      CASE( 'mixed oce-ice' )    ! the ice flux is cumputed from the total flux, the SST and ice informations 
     
    17661763      !         note: ziceld cannot be = 0 since we limit the ice concentration to amax 
    17671764      zqns_oce = 0._wp 
    1768       WHERE( ziceld /= 0._wp )  zqns_oce(:,:) = ( zqns_tot(:,:) - SUM( a_i * zqns_ice, dim=3 ) ) / ziceld(:,:) 
     1765      WHERE( ziceld /= 0._wp )   zqns_oce(:,:) = ( zqns_tot(:,:) - SUM( a_i * zqns_ice, dim=3 ) ) / ziceld(:,:) 
    17691766 
    17701767      ! Heat content per unit mass of snow (J/kg) 
     
    18591856         ELSE 
    18601857            ! Set all category values equal for the moment 
    1861             DO jl=1,jpl 
     1858            DO jl = 1, jpl 
    18621859               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 
    1863             ENDDO 
     1860            END DO 
    18641861         ENDIF 
    18651862         zqsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
     
    18681865         zqsr_tot(:,:  ) =  ziceld(:,:) * frcv(jpr_qsroce)%z3(:,:,1) 
    18691866         IF ( TRIM(sn_rcv_qsr%clcat) == 'yes' ) THEN 
    1870             DO jl=1,jpl 
     1867            DO jl = 1, jpl 
    18711868               zqsr_tot(:,:   ) = zqsr_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qsrice)%z3(:,:,jl)    
    18721869               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,jl) 
    1873             ENDDO 
     1870            END DO 
    18741871         ELSE 
    18751872            qsr_tot(:,:   ) = qsr_tot(:,:) + picefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 
    1876             DO jl=1,jpl 
     1873            DO jl = 1, jpl 
    18771874               zqsr_tot(:,:   ) = zqsr_tot(:,:) + picefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 
    18781875               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 
    1879             ENDDO 
     1876            END DO 
    18801877         ENDIF 
    18811878      CASE( 'mixed oce-ice' ) 
     
    18901887      IF( ln_dm2dc .AND. ln_cpl ) THEN   ! modify qsr to include the diurnal cycle 
    18911888         zqsr_tot(:,:  ) = sbc_dcy( zqsr_tot(:,:  ) ) 
    1892          DO jl=1,jpl 
     1889         DO jl = 1, jpl 
    18931890            zqsr_ice(:,:,jl) = sbc_dcy( zqsr_ice(:,:,jl) ) 
    1894          ENDDO 
     1891         END DO 
    18951892      ENDIF 
    18961893 
     
    19081905         qsr_tot(:,:) = qsr(:,:) * ziceld(:,:) + SUM( qsr_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk 
    19091906         qsr_tot(:,:) = qsr_tot(:,:) * xcplmask(:,:,0) +  zqsr_tot(:,:)* zmsk(:,:) 
    1910          DO jl=1,jpl 
     1907         DO jl = 1, jpl 
    19111908            qsr_ice(:,:,jl) = qsr_ice(:,:,jl) * xcplmask(:,:,0) +  zqsr_ice(:,:,jl)* zmsk(:,:) 
    1912          ENDDO 
     1909         END DO 
    19131910      ELSE 
    19141911         qsr_tot(:,:  ) = zqsr_tot(:,:  ) 
     
    19461943      END SELECT 
    19471944 
    1948       ! Surface transimission parameter io (Maykut Untersteiner , 1971 ; Ebert and Curry, 1993 ) 
    1949       ! Used for LIM3 
    1950       ! Coupled case: since cloud cover is not received from atmosphere  
    1951       !               ===> used prescribed cloud fraction representative for polar oceans in summer (0.81) 
    1952       fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 
    1953       fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 
    1954  
    1955       CALL wrk_dealloc( jpi,jpj,     zcptn, zcptrain, zcptsnw, ziceld, zmsk, zsnw ) 
    1956       CALL wrk_dealloc( jpi,jpj,     zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip, zevap_oce, zevap_ice, zdevap_ice ) 
    1957       CALL wrk_dealloc( jpi,jpj,     zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice ) 
    1958       CALL wrk_dealloc( jpi,jpj,jpl, zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice ) 
     1945      !                                                      ! ========================= ! 
     1946      !                                                      !      Transmitted Qsr      !   [W/m2] 
     1947      !                                                      ! ========================= ! 
     1948      SELECT CASE( nice_jules ) 
     1949      CASE( np_jules_OFF    )       !==  No Jules coupler  ==! 
     1950         ! 
     1951!!gm         ! former coding was     
     1952!!gm         ! Coupled case: since cloud cover is not received from atmosphere  
     1953!!gm         !               ===> used prescribed cloud fraction representative for polar oceans in summer (0.81) 
     1954!!gm         !     fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 
     1955!!gm         !     fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 
     1956!!gm          
     1957!!gm         ! to retrieve that coding, we needed to access h_i & h_s from here 
     1958!!gm         ! we could even retrieve cloud fraction from the coupler 
     1959!!gm         ! 
     1960!!gm         zfrqsr_tr_i(:,:,:) = 0._wp   !   surface transmission parameter 
     1961!!gm         ! 
     1962!!gm         DO jl = 1, jpl 
     1963!!gm            DO jj = 1 , jpj 
     1964!!gm               DO ji = 1, jpi 
     1965!!gm                  !              !--- surface transmission parameter (Grenfell Maykut 77) --- ! 
     1966!!gm                  zfrqsr_tr_i(ji,jj,jl) = 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice  
     1967!!gm                  ! 
     1968!!gm                  !              ! --- influence of snow and thin ice --- ! 
     1969!!gm                  IF ( phs(ji,jj,jl) >= 0.0_wp )   zfrqsr_tr_i(ji,jj,jl) = 0._wp   !   snow fully opaque 
     1970!!gm                  IF ( phi(ji,jj,jl) <= 0.1_wp )   zfrqsr_tr_i(ji,jj,jl) = 1._wp   !   thin ice transmits all solar radiation 
     1971!!gm               END DO 
     1972!!gm            END DO 
     1973!!gm         END DO 
     1974!!gm         ! 
     1975!!gm         qsr_ice_tr(:,:,:) =   zfrqsr_tr_i(:,:,:) * qsr_ice(:,:,:)               !   transmitted solar radiation  
     1976!!gm         ! 
     1977!!gm better coding of the above calculation: 
     1978         ! 
     1979         !                    ! ===> used prescribed cloud fraction representative for polar oceans in summer (0.81) 
     1980         ztri = 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice    ! surface transmission parameter (Grenfell Maykut 77) 
     1981         ! 
     1982         qsr_ice_tr(:,:,:) = ztri * qsr_ice(:,:,:) 
     1983         WHERE( phs(:,:,:) >= 0.0_wp )   qsr_ice_tr(:,:,:) = 0._wp            ! snow fully opaque 
     1984         WHERE( phi(:,:,:) <= 0.1_wp )   qsr_ice_tr(:,:,:) = qsr_ice(:,:,:)   ! thin ice transmits all solar radiation 
     1985!!gm end 
     1986         !      
     1987      CASE( np_jules_ACTIVE )       !==  Jules coupler is active  ==! 
     1988         ! 
     1989         !                    ! ===> here we must receive the qsr_ice_tr array from the coupler 
     1990         !                           for now just assume zero (fully opaque ice) 
     1991         qsr_ice_tr(:,:,:) = 0._wp 
     1992         ! 
     1993      END SELECT 
    19591994      ! 
    19601995      IF( nn_timing == 1 )   CALL timing_stop('sbc_cpl_ice_flx') 
     
    20812116      IF( ssnd(jps_albmix)%laction ) THEN                         ! mixed ice-ocean 
    20822117         ztmp1(:,:) = alb_oce_mix(:,:) * zfr_l(:,:) 
    2083          DO jl=1,jpl 
     2118         DO jl = 1, jpl 
    20842119            ztmp1(:,:) = ztmp1(:,:) + alb_ice(:,:,jl) * a_i(:,:,jl) 
    20852120         END DO 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_cice.F90

    r8586 r8813  
    710710      !                                         !   Prepare Coupling fields   ! 
    711711      !                                         ! =========================== ! 
    712  
    713 ! x and y comp of ice velocity 
    714  
     712      ! 
     713      ! x and y comp of ice velocity 
     714      ! 
    715715      CALL cice2nemo(uvel,u_ice,'F', -1. ) 
    716716      CALL cice2nemo(vvel,v_ice,'F', -1. ) 
    717  
    718 ! Ice concentration (CO_1) = a_i calculated at end of cice_sbc_out   
    719  
    720 ! Snow and ice thicknesses (CO_2 and CO_3) 
    721  
    722       DO jl = 1,ncat 
     717      ! 
     718      ! Ice concentration (CO_1) = a_i calculated at end of cice_sbc_out   
     719      ! 
     720      ! Snow and ice thicknesses (CO_2 and CO_3) 
     721      ! 
     722      DO jl = 1, ncat 
    723723         CALL cice2nemo( vsnon(:,:,jl,:), h_s(:,:,jl),'T', 1. ) 
    724724         CALL cice2nemo( vicen(:,:,jl,:), h_i(:,:,jl),'T', 1. ) 
    725       ENDDO 
     725      END DO 
    726726      ! 
    727727      IF( nn_timing == 1 )  CALL timing_stop('cice_sbc_hadgam') 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbcisf.F90

    r8586 r8813  
    2121   ! 
    2222   USE in_out_manager ! I/O manager 
    23    USE iom            ! I/O manager library 
     23   USE iom            ! I/O library 
    2424   USE fldread        ! read input field at current time step 
    2525   USE lbclnk         ! 
     
    4141   REAL(wp), PUBLIC ::   rn_gammas0                  !: salinity    exchange coeficient [] 
    4242 
    43    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   risf_tsc_b, risf_tsc  !: before and now T & S isf contents [K.m/s & PSU.m/s]   
    44    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qisf                  !: net heat flux from ice shelf      [W/m2] 
    45    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  rzisf_tbl              !:depth of calving front (shallowest point) nn_isf ==2/3 
    46    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  rhisf_tbl, rhisf_tbl_0 !:thickness of tbl  [m] 
    47    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  r1_hisf_tbl            !:1/thickness of tbl 
    48    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  ralpha                 !:proportion of bottom cell influenced by tbl  
    49    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  risfLeff               !:effective length (Leff) BG03 nn_isf==2 
    50    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  ttbl, stbl, utbl, vtbl !:top boundary layer variable at T point 
    51    INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::  misfkt, misfkb         !:Level of ice shelf base 
    52  
    53    LOGICAL, PUBLIC ::   l_isfcpl = .false.       ! isf recieved from oasis 
    54  
    55    REAL(wp), PUBLIC, SAVE ::   rcpi     = 2000.0_wp     ! specific heat of ice shelf             [J/kg/K] 
    56    REAL(wp), PUBLIC, SAVE ::   rkappa   = 1.54e-6_wp    ! heat diffusivity through the ice-shelf [m2/s] 
    57    REAL(wp), PUBLIC, SAVE ::   rhoisf   = 920.0_wp      ! volumic mass of ice shelf              [kg/m3] 
    58    REAL(wp), PUBLIC, SAVE ::   tsurf    = -20.0_wp      ! air temperature on top of ice shelf    [C] 
    59    REAL(wp), PUBLIC, SAVE ::   rlfusisf = 0.334e6_wp    ! latent heat of fusion of ice shelf     [J/kg] 
     43   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   misfkt   , misfkb        !: Level of ice shelf base 
     44   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rzisf_tbl                !: depth of calving front (shallowest point) nn_isf ==2/3 
     45   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rhisf_tbl, rhisf_tbl_0   !: thickness of tbl  [m] 
     46   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   r1_hisf_tbl              !: 1/thickness of tbl 
     47   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ralpha                   !: proportion of bottom cell influenced by tbl  
     48   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   risfLeff                 !: effective length (Leff) BG03 nn_isf==2 
     49   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ttbl, stbl, utbl, vtbl   !: top boundary layer variable at T point 
     50   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qisf                     !: net heat flux from ice shelf      [W/m2] 
     51   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   risf_tsc_b, risf_tsc     !: before and now T & S isf contents [K.m/s & PSU.m/s]   
     52 
     53   LOGICAL, PUBLIC ::   l_isfcpl = .false.       !: isf recieved from oasis 
     54 
     55   REAL(wp), PUBLIC, SAVE ::   rcpi     = 2000.0_wp     !: specific heat of ice shelf             [J/kg/K] 
     56   REAL(wp), PUBLIC, SAVE ::   rkappa   = 1.54e-6_wp    !: heat diffusivity through the ice-shelf [m2/s] 
     57   REAL(wp), PUBLIC, SAVE ::   rhoisf   = 920.0_wp      !: volumic mass of ice shelf              [kg/m3] 
     58   REAL(wp), PUBLIC, SAVE ::   tsurf    = -20.0_wp      !: air temperature on top of ice shelf    [C] 
     59   REAL(wp), PUBLIC, SAVE ::   rlfusisf = 0.334e6_wp    !: latent heat of fusion of ice shelf     [J/kg] 
    6060 
    6161!: Variable used in fldread to read the forcing file (nn_isf == 4 .OR. nn_isf == 3) 
     
    7070    
    7171   !!---------------------------------------------------------------------- 
    72    !! NEMO/OPA 3.7 , LOCEAN-IPSL (2015) 
     72   !! NEMO/OPA 4.0 , LOCEAN-IPSL (2017) 
    7373   !! $Id$ 
    7474   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
     
    9191      INTEGER, INTENT(in) ::   kt   ! ocean time step 
    9292      ! 
    93       INTEGER :: ji, jj, jk   ! loop index 
    94       INTEGER :: ikt, ikb     ! local integers 
     93      INTEGER ::   ji, jj, jk   ! loop index 
     94      INTEGER ::   ikt, ikb     ! local integers 
    9595      REAL(wp), DIMENSION(jpi,jpj) ::   zt_frz, zdep   ! freezing temperature (zt_frz) at depth (zdep)  
    9696      REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   zqhcisf2d 
Note: See TracChangeset for help on using the changeset viewer.