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 6020 for branches/UKMO/icebergs_restart_single_file/NEMOGCM/NEMO/OPA_SRC/BDY/bdyice_lim.F90 – NEMO

Ignore:
Timestamp:
2015-12-08T12:39:53+01:00 (8 years ago)
Author:
timgraham
Message:

Merged with head of trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/icebergs_restart_single_file/NEMOGCM/NEMO/OPA_SRC/BDY/bdyice_lim.F90

    r6019 r6020  
    5959      !! 
    6060      !!---------------------------------------------------------------------- 
    61       INTEGER, INTENT( in ) :: kt     ! Main time step counter 
    62       INTEGER               :: ib_bdy ! Loop index 
    63  
     61      INTEGER, INTENT( in ) ::   kt   ! Main time step counter 
     62      ! 
     63      INTEGER ::   ib_bdy   ! Loop index 
     64      !!---------------------------------------------------------------------- 
     65      ! 
    6466#if defined key_lim3 
    6567      CALL lim_var_glo2eqv 
    6668#endif 
    67  
     69      ! 
    6870      DO ib_bdy=1, nb_bdy 
    69  
     71         ! 
    7072         SELECT CASE( cn_ice_lim(ib_bdy) ) 
    7173         CASE('none') 
     
    7678            CALL ctl_stop( 'bdy_ice_lim : unrecognised option for open boundaries for ice fields' ) 
    7779         END SELECT 
    78  
     80         ! 
    7981      END DO 
    80  
     82      ! 
    8183#if defined key_lim3 
    8284      CALL lim_var_zapsmall 
    8385      CALL lim_var_agg(1) 
    8486#endif 
    85  
     87      ! 
    8688   END SUBROUTINE bdy_ice_lim 
     89 
    8790 
    8891   SUBROUTINE bdy_ice_frs( idx, dta, kt, ib_bdy ) 
     
    9699      !!             dimensional baroclinic ocean model with realistic topography. Tellus, 365-382. 
    97100      !!------------------------------------------------------------------------------ 
    98       TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    99       TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
    100       INTEGER,         INTENT(in) ::   kt   ! main time-step counter 
     101      TYPE(OBC_INDEX), INTENT(in) ::   idx     ! OBC indices 
     102      TYPE(OBC_DATA),  INTENT(in) ::   dta     ! OBC external data 
     103      INTEGER,         INTENT(in) ::   kt      ! main time-step counter 
    101104      INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
    102  
     105      ! 
    103106      INTEGER  ::   jpbound            ! 0 = incoming ice 
    104                                        ! 1 = outgoing ice 
     107      !                                ! 1 = outgoing ice 
    105108      INTEGER  ::   jb, jk, jgrd, jl   ! dummy loop indices 
    106109      INTEGER  ::   ji, jj, ii, ij     ! local scalar 
    107110      REAL(wp) ::   zwgt, zwgt1        ! local scalar 
    108111      REAL(wp) ::   ztmelts, zdh 
    109  
    110       !!------------------------------------------------------------------------------ 
    111       ! 
    112       IF( nn_timing == 1 ) CALL timing_start('bdy_ice_frs') 
     112#if  defined key_lim2 && ! defined key_lim2_vp && defined key_agrif 
     113     USE ice_2, vt_s => hsnm 
     114     USE ice_2, vt_i => hicm 
     115#endif 
     116      !!------------------------------------------------------------------------------ 
     117      ! 
     118      IF( nn_timing == 1 )   CALL timing_start('bdy_ice_frs') 
    113119      ! 
    114120      jgrd = 1      ! Everything is at T-points here 
     
    177183            ! condition on ice thickness depends on the ice velocity 
    178184            ! if velocity is outward (strictly), then ice thickness, volume... must be equal to adjacent values 
    179             jpbound = 0; ii = ji; ij = jj; 
    180  
     185            jpbound = 0   ;   ii = ji   ;   ij = jj 
     186            ! 
    181187            IF( u_ice(ji+1,jj  ) < 0. .AND. umask(ji-1,jj  ,1) == 0. ) jpbound = 1; ii = ji+1; ij = jj 
    182188            IF( u_ice(ji-1,jj  ) > 0. .AND. umask(ji+1,jj  ,1) == 0. ) jpbound = 1; ii = ji-1; ij = jj 
    183189            IF( v_ice(ji  ,jj+1) < 0. .AND. vmask(ji  ,jj-1,1) == 0. ) jpbound = 1; ii = ji  ; ij = jj+1 
    184190            IF( v_ice(ji  ,jj-1) > 0. .AND. vmask(ji  ,jj+1,1) == 0. ) jpbound = 1; ii = ji  ; ij = jj-1 
    185  
     191            ! 
    186192            IF( nn_ice_lim_dta(ib_bdy) == 0 ) jpbound = 0; ii = ji; ij = jj   ! case ice boundaries = initial conditions 
    187                                                                               !      do not make state variables dependent on velocity 
    188                 
    189  
     193            !                                                                 !      do not make state variables dependent on velocity 
     194            ! 
    190195            rswitch = MAX( 0.0_wp , SIGN ( 1.0_wp , at_i(ii,ij) - 0.01 ) ) ! 0 if no ice 
    191  
     196            ! 
    192197            ! concentration and thickness 
    193198            a_i (ji,jj,jl) = a_i (ii,ij,jl) * rswitch 
    194199            ht_i(ji,jj,jl) = ht_i(ii,ij,jl) * rswitch 
    195200            ht_s(ji,jj,jl) = ht_s(ii,ij,jl) * rswitch 
    196  
     201            ! 
    197202            ! Ice and snow volumes 
    198203            v_i(ji,jj,jl) = ht_i(ji,jj,jl) * a_i(ji,jj,jl) 
    199204            v_s(ji,jj,jl) = ht_s(ji,jj,jl) * a_i(ji,jj,jl) 
    200  
     205            ! 
    201206            SELECT CASE( jpbound ) 
    202  
    203             CASE( 0 ) ! velocity is inward 
    204  
     207            ! 
     208            CASE( 0 )   ! velocity is inward 
     209               ! 
    205210               ! Ice salinity, age, temperature 
    206211               sm_i(ji,jj,jl)   = rswitch * rn_ice_sal(ib_bdy)  + ( 1.0 - rswitch ) * rn_simin 
     
    214219                  s_i(ji,jj,jk,jl) = rswitch * rn_ice_sal(ib_bdy) + ( 1.0 - rswitch ) * rn_simin 
    215220               END DO 
    216                 
    217             CASE( 1 ) ! velocity is outward 
    218   
     221               ! 
     222            CASE( 1 )   ! velocity is outward 
     223               ! 
    219224               ! Ice salinity, age, temperature 
    220225               sm_i(ji,jj,jl)   = rswitch * sm_i(ii,ij,jl)  + ( 1.0 - rswitch ) * rn_simin 
     
    228233                  s_i(ji,jj,jk,jl) = rswitch * s_i(ii,ij,jk,jl) + ( 1.0 - rswitch ) * rn_simin 
    229234               END DO 
    230  
     235               ! 
    231236            END SELECT 
    232  
    233             ! if salinity is constant, then overwrite rn_ice_sal 
    234             IF( nn_icesal == 1 ) THEN 
    235                sm_i(ji,jj,jl)   = rn_icesal 
     237            ! 
     238            IF( nn_icesal == 1 ) THEN     ! constant salinity : overwrite rn_ice_sal 
     239               sm_i(ji,jj  ,jl) = rn_icesal 
    236240               s_i (ji,jj,:,jl) = rn_icesal 
    237241            ENDIF 
    238  
     242            ! 
    239243            ! contents 
    240244            smv_i(ji,jj,jl)  = MIN( sm_i(ji,jj,jl) , sss_m(ji,jj) ) * v_i(ji,jj,jl) 
     
    255259               e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * a_i(ji,jj,jl) * ht_i(ji,jj,jl) * r1_nlay_i 
    256260            END DO 
    257  
     261            ! 
    258262         END DO 
    259   
     263         ! 
    260264         CALL lbc_bdy_lnk(  a_i(:,:,jl), 'T', 1., ib_bdy ) 
    261265         CALL lbc_bdy_lnk( ht_i(:,:,jl), 'T', 1., ib_bdy ) 
     
    263267         CALL lbc_bdy_lnk(  v_i(:,:,jl), 'T', 1., ib_bdy ) 
    264268         CALL lbc_bdy_lnk(  v_s(:,:,jl), 'T', 1., ib_bdy ) 
    265   
     269         ! 
    266270         CALL lbc_bdy_lnk( smv_i(:,:,jl), 'T', 1., ib_bdy ) 
    267271         CALL lbc_bdy_lnk(  sm_i(:,:,jl), 'T', 1., ib_bdy ) 
     
    276280            CALL lbc_bdy_lnk(e_i(:,:,jk,jl), 'T', 1., ib_bdy ) 
    277281         END DO 
    278  
     282         ! 
    279283      END DO !jl 
    280      
     284      ! 
    281285#endif 
    282286      !       
    283       IF( nn_timing == 1 ) CALL timing_stop('bdy_ice_frs') 
     287      IF( nn_timing == 1 )   CALL timing_stop('bdy_ice_frs') 
    284288      ! 
    285289   END SUBROUTINE bdy_ice_frs 
     
    296300      !! 2013-06 : C. Rousset 
    297301      !!------------------------------------------------------------------------------ 
    298       !! 
    299302      CHARACTER(len=1), INTENT(in)  ::   cd_type   ! nature of velocity grid-points 
     303      ! 
    300304      INTEGER  ::   jb, jgrd           ! dummy loop indices 
    301305      INTEGER  ::   ji, jj             ! local scalar 
    302306      INTEGER  ::   ib_bdy             ! Loop index 
    303307      REAL(wp) ::   zmsk1, zmsk2, zflag 
    304      !!------------------------------------------------------------------------------ 
     308      !!------------------------------------------------------------------------------ 
    305309      ! 
    306310      IF( nn_timing == 1 ) CALL timing_start('bdy_ice_lim_dyn') 
     
    309313         ! 
    310314         SELECT CASE( cn_ice_lim(ib_bdy) ) 
    311  
     315         ! 
    312316         CASE('none') 
    313  
    314317            CYCLE 
    315              
     318            ! 
    316319         CASE('frs') 
    317              
     320            ! 
    318321            IF( nn_ice_lim_dta(ib_bdy) == 0 ) CYCLE            ! case ice boundaries = initial conditions  
    319                                                                !      do not change ice velocity (it is only computed by rheology) 
    320   
     322            !                                                  !      do not change ice velocity (it is only computed by rheology) 
    321323            SELECT CASE ( cd_type ) 
    322                 
    323             CASE ( 'U' ) 
    324                 
     324            !      
     325            CASE ( 'U' )   
    325326               jgrd = 2      ! u velocity 
    326327               DO jb = 1, idx_bdy(ib_bdy)%nblen(jgrd) 
     
    328329                  jj    = idx_bdy(ib_bdy)%nbj(jb,jgrd) 
    329330                  zflag = idx_bdy(ib_bdy)%flagu(jb,jgrd) 
    330                    
     331                  ! 
    331332                  IF ( ABS( zflag ) == 1. ) THEN  ! eastern and western boundaries 
    332333                     ! one of the two zmsk is always 0 (because of zflag) 
    333334                     zmsk1 = 1._wp - MAX( 0.0_wp, SIGN ( 1.0_wp , - vt_i(ji+1,jj) ) ) ! 0 if no ice 
    334335                     zmsk2 = 1._wp - MAX( 0.0_wp, SIGN ( 1.0_wp , - vt_i(ji-1,jj) ) ) ! 0 if no ice 
    335                       
     336                      
    336337                     ! u_ice = u_ice of the adjacent grid point except if this grid point is ice-free (then u_ice = u_oce) 
    337338                     u_ice (ji,jj) = u_ice(ji+1,jj) * 0.5_wp * ABS( zflag + 1._wp ) * zmsk1 + & 
     
    345346                  rswitch = MAX( 0.0_wp , SIGN ( 1.0_wp , at_i(ji,jj) - 0.01_wp ) ) ! 0 if no ice 
    346347                  u_ice(ji,jj) = rswitch * u_ice(ji,jj) 
    347                    
    348                ENDDO 
    349                 
     348                  ! 
     349               END DO 
    350350               CALL lbc_bdy_lnk( u_ice(:,:), 'U', -1., ib_bdy ) 
    351                 
     351               ! 
    352352            CASE ( 'V' ) 
    353                 
    354353               jgrd = 3      ! v velocity 
    355354               DO jb = 1, idx_bdy(ib_bdy)%nblen(jgrd) 
     
    357356                  jj    = idx_bdy(ib_bdy)%nbj(jb,jgrd) 
    358357                  zflag = idx_bdy(ib_bdy)%flagv(jb,jgrd) 
    359                    
     358                  ! 
    360359                  IF ( ABS( zflag ) == 1. ) THEN  ! northern and southern boundaries 
    361360                     ! one of the two zmsk is always 0 (because of zflag) 
    362361                     zmsk1 = 1._wp - MAX( 0.0_wp, SIGN ( 1.0_wp , - vt_i(ji,jj+1) ) ) ! 0 if no ice 
    363362                     zmsk2 = 1._wp - MAX( 0.0_wp, SIGN ( 1.0_wp , - vt_i(ji,jj-1) ) ) ! 0 if no ice 
    364                       
     363                      
    365364                     ! u_ice = u_ice of the adjacent grid point except if this grid point is ice-free (then u_ice = u_oce) 
    366365                     v_ice (ji,jj) = v_ice(ji,jj+1) * 0.5_wp * ABS( zflag + 1._wp ) * zmsk1 + & 
     
    374373                  rswitch = MAX( 0.0_wp , SIGN ( 1.0_wp , at_i(ji,jj) - 0.01 ) ) ! 0 if no ice 
    375374                  v_ice(ji,jj) = rswitch * v_ice(ji,jj) 
    376                    
    377                ENDDO 
    378                 
     375                  ! 
     376               END DO 
    379377               CALL lbc_bdy_lnk( v_ice(:,:), 'V', -1., ib_bdy ) 
    380                    
     378               ! 
    381379            END SELECT 
    382              
     380            ! 
    383381         CASE DEFAULT 
    384382            CALL ctl_stop( 'bdy_ice_lim_dyn : unrecognised option for open boundaries for ice fields' ) 
    385383         END SELECT 
    386           
    387       ENDDO 
    388  
     384         ! 
     385      END DO 
     386      ! 
    389387      IF( nn_timing == 1 ) CALL timing_stop('bdy_ice_lim_dyn') 
    390        
     388      ! 
    391389    END SUBROUTINE bdy_ice_lim_dyn 
    392390 
Note: See TracChangeset for help on using the changeset viewer.