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 5208 for branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limitd_th.F90 – NEMO

Ignore:
Timestamp:
2015-04-13T15:08:59+02:00 (9 years ago)
Author:
davestorkey
Message:

Merge in changes from trunk up to 5021.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limitd_th.F90

    r4688 r5208  
    66   !! History :   -   !          (W. H. Lipscomb and E.C. Hunke) CICE (c) original code 
    77   !!            3.0  ! 2005-12  (M. Vancoppenolle) adaptation to LIM-3 
    8    !!             -   ! 2006-06  (M. Vancoppenolle) adaptation to include salt, age and types 
     8   !!             -   ! 2006-06  (M. Vancoppenolle) adaptation to include salt, age 
    99   !!             -   ! 2007-04  (M. Vancoppenolle) Mass conservation checked 
    1010   !!---------------------------------------------------------------------- 
     
    4646   PUBLIC   lim_itd_shiftice 
    4747 
    48    REAL(wp) ::   epsi10 = 1.e-10_wp   ! 
    49    REAL(wp) ::   epsi06 = 1.e-6_wp   ! 
    50  
    5148   !!---------------------------------------------------------------------- 
    5249   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2010) 
     
    6663      INTEGER, INTENT(in) ::   kt   ! time step index 
    6764      ! 
    68       INTEGER ::   ji,jj, jk, jl, ja, jm, jbnd1, jbnd2   ! ice types    dummy loop index          
     65      INTEGER ::   ji, jj, jk, jl   ! dummy loop index          
    6966      ! 
    7067      REAL(wp) :: zvi_b, zsmv_b, zei_b, zfs_b, zfw_b, zft_b  
     
    8683      ! Given thermodynamic growth rates, transport ice between 
    8784      ! thickness categories. 
    88       DO jm = 1, jpm 
    89          jbnd1 = ice_cat_bounds(jm,1) 
    90          jbnd2 = ice_cat_bounds(jm,2) 
    91          IF( ice_ncat_types(jm) > 1 )   CALL lim_itd_th_rem( jbnd1, jbnd2, jm, kt ) 
    92       END DO 
     85      IF( jpl > 1 )   CALL lim_itd_th_rem( 1, jpl, kt ) 
    9386      ! 
    9487      CALL lim_var_glo2eqv    ! only for info 
     
    123116            CALL prt_ctl(tab2d_1=sm_i  (:,:,jl)   , clinfo1= ' lim_itd_th  : sm_i     : ') 
    124117            CALL prt_ctl(tab2d_1=smv_i (:,:,jl)   , clinfo1= ' lim_itd_th  : smv_i    : ') 
    125             DO ja = 1, nlay_i 
     118            DO jk = 1, nlay_i 
    126119               CALL prt_ctl_info(' ') 
    127                CALL prt_ctl_info(' - Layer : ', ivar1=ja) 
     120               CALL prt_ctl_info(' - Layer : ', ivar1=jk) 
    128121               CALL prt_ctl_info('   ~~~~~~~') 
    129                CALL prt_ctl(tab2d_1=t_i(:,:,ja,jl) , clinfo1= ' lim_itd_th  : t_i      : ') 
    130                CALL prt_ctl(tab2d_1=e_i(:,:,ja,jl) , clinfo1= ' lim_itd_th  : e_i      : ') 
     122               CALL prt_ctl(tab2d_1=t_i(:,:,jk,jl) , clinfo1= ' lim_itd_th  : t_i      : ') 
     123               CALL prt_ctl(tab2d_1=e_i(:,:,jk,jl) , clinfo1= ' lim_itd_th  : e_i      : ') 
    131124            END DO 
    132125         END DO 
     
    140133   ! 
    141134 
    142    SUBROUTINE lim_itd_th_rem( klbnd, kubnd, ntyp, kt ) 
     135   SUBROUTINE lim_itd_th_rem( klbnd, kubnd, kt ) 
    143136      !!------------------------------------------------------------------ 
    144137      !!                ***  ROUTINE lim_itd_th_rem *** 
     
    153146      INTEGER , INTENT (in) ::   klbnd   ! Start thickness category index point 
    154147      INTEGER , INTENT (in) ::   kubnd   ! End point on which the  the computation is applied 
    155       INTEGER , INTENT (in) ::   ntyp    ! Number of the type used 
    156148      INTEGER , INTENT (in) ::   kt      ! Ocean time step  
    157149      ! 
     
    161153      REAL(wp) ::   zx1, zwk1, zdh0, zetamin, zdamax   ! local scalars 
    162154      REAL(wp) ::   zx2, zwk2, zda0, zetamax           !   -      - 
    163       REAL(wp) ::   zx3,             zareamin, zindb   !   -      - 
     155      REAL(wp) ::   zx3,             zareamin          !   -      - 
    164156      CHARACTER (len = 15) :: fieldid 
    165157 
     
    171163      REAL(wp), POINTER, DIMENSION(:,:,:) ::   hL          ! left boundary for the ITD for each thickness 
    172164      REAL(wp), POINTER, DIMENSION(:,:,:) ::   hR          ! left boundary for the ITD for each thickness 
    173       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zht_i_o     ! old ice thickness 
     165      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zht_i_b     ! old ice thickness 
    174166      REAL(wp), POINTER, DIMENSION(:,:,:) ::   dummy_es 
    175167      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zdaice, zdvice          ! local increment of ice area and volume 
     
    189181      CALL wrk_alloc( jpi,jpj, zremap_flag )    ! integer 
    190182      CALL wrk_alloc( jpi,jpj,jpl-1, zdonor )   ! integer 
    191       CALL wrk_alloc( jpi,jpj,jpl, zdhice, g0, g1, hL, hR, zht_i_o, dummy_es ) 
     183      CALL wrk_alloc( jpi,jpj,jpl, zdhice, g0, g1, hL, hR, zht_i_b, dummy_es ) 
    192184      CALL wrk_alloc( jpi,jpj,jpl-1, zdaice, zdvice )    
    193185      CALL wrk_alloc( jpi,jpj,jpl+1, zhbnew, kkstart = 0 )    
     
    218210         WRITE(numout,*) ' klbnd :       ', klbnd 
    219211         WRITE(numout,*) ' kubnd :       ', kubnd 
    220          WRITE(numout,*) ' ntyp  :       ', ntyp  
    221212      ENDIF 
    222213 
     
    225216         DO jj = 1, jpj 
    226217            DO ji = 1, jpi 
    227                zindb             = 1.0 - MAX( 0.0, SIGN( 1.0, - a_i(ji,jj,jl) + epsi10 ) )     !0 if no ice and 1 if yes 
    228                ht_i(ji,jj,jl)    = v_i(ji,jj,jl) / MAX( a_i(ji,jj,jl), epsi10 ) * zindb 
    229                zindb             = 1.0 - MAX( 0.0, SIGN( 1.0, - old_a_i(ji,jj,jl) + epsi10) ) !0 if no ice and 1 if yes 
    230                zht_i_o(ji,jj,jl) = old_v_i(ji,jj,jl) / MAX( old_a_i(ji,jj,jl), epsi10 ) * zindb 
    231                IF( a_i(ji,jj,jl) > epsi10 )   zdhice(ji,jj,jl) = ht_i(ji,jj,jl) - zht_i_o(ji,jj,jl)  
     218               rswitch             = 1.0 - MAX( 0.0, SIGN( 1.0, - a_i(ji,jj,jl) + epsi10 ) )     !0 if no ice and 1 if yes 
     219               ht_i(ji,jj,jl)    = v_i(ji,jj,jl) / MAX( a_i(ji,jj,jl), epsi10 ) * rswitch 
     220               rswitch             = 1.0 - MAX( 0.0, SIGN( 1.0, - a_i_b(ji,jj,jl) + epsi10) ) !0 if no ice and 1 if yes 
     221               zht_i_b(ji,jj,jl) = v_i_b(ji,jj,jl) / MAX( a_i_b(ji,jj,jl), epsi10 ) * rswitch 
     222               IF( a_i(ji,jj,jl) > epsi10 )   zdhice(ji,jj,jl) = ht_i(ji,jj,jl) - zht_i_b(ji,jj,jl)  
    232223            END DO 
    233224         END DO 
     
    274265            ! 
    275266            zhbnew(ii,ij,jl) = hi_max(jl) 
    276             IF ( old_a_i(ii,ij,jl) > epsi10 .AND. old_a_i(ii,ij,jl+1) > epsi10 ) THEN 
     267            IF ( a_i_b(ii,ij,jl) > epsi10 .AND. a_i_b(ii,ij,jl+1) > epsi10 ) THEN 
    277268               !interpolate between adjacent category growth rates 
    278                zslope           = ( zdhice(ii,ij,jl+1) - zdhice(ii,ij,jl) ) / ( zht_i_o(ii,ij,jl+1) - zht_i_o(ii,ij,jl) ) 
    279                zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl) + zslope * ( hi_max(jl) - zht_i_o(ii,ij,jl) ) 
    280             ELSEIF ( old_a_i(ii,ij,jl) > epsi10) THEN 
     269               zslope           = ( zdhice(ii,ij,jl+1) - zdhice(ii,ij,jl) ) / ( zht_i_b(ii,ij,jl+1) - zht_i_b(ii,ij,jl) ) 
     270               zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl) + zslope * ( hi_max(jl) - zht_i_b(ii,ij,jl) ) 
     271            ELSEIF ( a_i_b(ii,ij,jl) > epsi10) THEN 
    281272               zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl) 
    282             ELSEIF ( old_a_i(ii,ij,jl+1) > epsi10) THEN 
     273            ELSEIF ( a_i_b(ii,ij,jl+1) > epsi10) THEN 
    283274               zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl+1) 
    284275            ENDIF 
     
    321312      DO jj = 1, jpj 
    322313         DO ji = 1, jpi 
    323             zhb0(ji,jj) = hi_max_typ(0,ntyp) ! 0eme 
    324             zhb1(ji,jj) = hi_max_typ(1,ntyp) ! 1er 
     314            zhb0(ji,jj) = hi_max(0) ! 0eme 
     315            zhb1(ji,jj) = hi_max(1) ! 1er 
    325316 
    326317            zhbnew(ji,jj,klbnd-1) = 0._wp 
     
    343334      !----------------------------------------------------------------------------------------------- 
    344335      !- 7.1 g(h) for category 1 at start of time step 
    345       CALL lim_itd_fitline( klbnd, zhb0, zhb1, zht_i_o(:,:,klbnd),         & 
     336      CALL lim_itd_fitline( klbnd, zhb0, zhb1, zht_i_b(:,:,klbnd),         & 
    346337         &                  g0(:,:,klbnd), g1(:,:,klbnd), hL(:,:,klbnd),   & 
    347338         &                  hR(:,:,klbnd), zremap_flag ) 
     
    368359                  ! Constrain new thickness <= ht_i 
    369360                  zdamax = a_i(ii,ij,klbnd) * &  
    370                      (1.0 - ht_i(ii,ij,klbnd)/zht_i_o(ii,ij,klbnd)) ! zdamax > 0 
     361                     (1.0 - ht_i(ii,ij,klbnd)/zht_i_b(ii,ij,klbnd)) ! zdamax > 0 
    371362                  !ice area lost due to melting of thin ice 
    372363                  zda0   = MIN(zda0, zdamax) 
     
    382373            ELSE ! if ice accretion 
    383374               ! ji, a_i > epsi10; zdh0 > 0 
    384                IF ( ntyp .EQ. 1 ) zhbnew(ii,ij,klbnd-1) = MIN(zdh0,hi_max(klbnd))  
     375               zhbnew(ii,ij,klbnd-1) = MIN(zdh0,hi_max(klbnd))  
    385376               ! zhbnew was 0, and is shifted to the right to account for thin ice 
    386377               ! growth in openwater (F0 = f1) 
    387                IF ( ntyp .NE. 1 ) zhbnew(ii,ij,0) = 0  
    388                ! in other types there is 
    389                ! no open water growth (F0 = 0) 
    390378            ENDIF ! zdh0  
    391379 
     
    493481      CALL wrk_dealloc( jpi,jpj, zremap_flag )    ! integer 
    494482      CALL wrk_dealloc( jpi,jpj,jpl-1, zdonor )   ! integer 
    495       CALL wrk_dealloc( jpi,jpj,jpl, zdhice, g0, g1, hL, hR, zht_i_o, dummy_es ) 
     483      CALL wrk_dealloc( jpi,jpj,jpl, zdhice, g0, g1, hL, hR, zht_i_b, dummy_es ) 
    496484      CALL wrk_dealloc( jpi,jpj,jpl-1, zdaice, zdvice )    
    497485      CALL wrk_dealloc( jpi,jpj,jpl+1, zhbnew, kkstart = 0 )    
     
    598586      REAL(wp) ::   zdo_aice           ! ice age times volume transferred 
    599587      REAL(wp) ::   zdaTsf             ! aicen*Tsfcn transferred 
    600       REAL(wp) ::   zindsn             ! snow or not 
    601       REAL(wp) ::   zindb              ! ice or not 
    602588 
    603589      INTEGER, POINTER, DIMENSION(:) ::   nind_i, nind_j   ! compressed indices for i/j directions 
     
    726712 
    727713            jl1 = zdonor(ii,ij,jl) 
    728             zindb             = MAX( 0.0 , SIGN( 1.0 , v_i(ii,ij,jl1) - epsi10 ) ) 
    729             zworka(ii,ij)   = zdvice(ii,ij,jl) / MAX(v_i(ii,ij,jl1),epsi10) * zindb 
     714            rswitch             = MAX( 0.0 , SIGN( 1.0 , v_i(ii,ij,jl1) - epsi10 ) ) 
     715            zworka(ii,ij)   = zdvice(ii,ij,jl) / MAX(v_i(ii,ij,jl1),epsi10) * rswitch 
    730716            IF( jl1 == jl) THEN   ;   jl2 = jl1+1 
    731717            ELSE                    ;   jl2 = jl  
     
    823809                  ht_i(ji,jj,jl)  =  v_i   (ji,jj,jl) / a_i(ji,jj,jl)  
    824810                  t_su(ji,jj,jl)  =  zaTsfn(ji,jj,jl) / a_i(ji,jj,jl)  
    825                   zindsn          =  1.0 - MAX(0.0,SIGN(1.0,-v_s(ji,jj,jl)+epsi10)) !0 if no ice and 1 if yes 
     811                  rswitch         =  1.0 - MAX(0.0,SIGN(1.0,-v_s(ji,jj,jl)+epsi10)) !0 if no ice and 1 if yes 
    826812               ELSE 
    827813                  ht_i(ji,jj,jl)  = 0._wp 
     
    839825    
    840826 
    841    SUBROUTINE lim_itd_th_reb( klbnd, kubnd, ntyp ) 
     827   SUBROUTINE lim_itd_th_reb( klbnd, kubnd ) 
    842828      !!------------------------------------------------------------------ 
    843829      !!                ***  ROUTINE lim_itd_th_reb *** 
     
    849835      INTEGER , INTENT (in) ::   klbnd   ! Start thickness category index point 
    850836      INTEGER , INTENT (in) ::   kubnd   ! End point on which the  the computation is applied 
    851       INTEGER , INTENT (in) ::   ntyp    ! number of the ice type involved in the rebinning process 
    852837      ! 
    853838      INTEGER ::   ji,jj, jl   ! dummy loop indices 
     
    889874 
    890875      !------------------------------------------------------------------------------ 
    891       ! 2) Make sure thickness of cat klbnd is at least hi_max_typ(klbnd) 
     876      ! 2) Make sure thickness of cat klbnd is at least hi_max(klbnd) 
    892877      !------------------------------------------------------------------------------ 
    893878      DO jj = 1, jpj  
    894879         DO ji = 1, jpi  
    895880            IF( a_i(ji,jj,klbnd) > epsi10 ) THEN 
    896                IF( ht_i(ji,jj,klbnd) <= hi_max_typ(0,ntyp) .AND. hi_max_typ(0,ntyp) > 0._wp ) THEN 
    897                   a_i(ji,jj,klbnd)  = v_i(ji,jj,klbnd) / hi_max_typ(0,ntyp)  
    898                   ht_i(ji,jj,klbnd) = hi_max_typ(0,ntyp) 
     881               IF( ht_i(ji,jj,klbnd) <= hi_max(0) .AND. hi_max(0) > 0._wp ) THEN 
     882                  a_i(ji,jj,klbnd)  = v_i(ji,jj,klbnd) / hi_max(0)  
     883                  ht_i(ji,jj,klbnd) = hi_max(0) 
    899884               ENDIF 
    900885            ENDIF 
Note: See TracChangeset for help on using the changeset viewer.